我对Car和Driver做了一个1对1的外键映射,在Driver表里有一个carid的外键,为什么我用下面的Junit测试,总是取不到car的值呢?
下面的单元测试有没有问题? 不过,我试过存储和查询是没有问题的。如果我要通过Car就可以知道Driver的信息,通过Driver也可以知道Car的信息,我要怎么做?
public class TestDriverDAO extends TestCase {
private ApplicationContext applicationContext;
private CarDAO carDAO;
private DriverDAO driverDAO; @Override
protected void setUp() throws Exception {
super.setUp();
applicationContext = new FileSystemXmlApplicationContext(
"src/application-*.xml"); carDAO = (CarDAO) applicationContext.getBean("carDAOImpl");
driverDAO = (DriverDAO) applicationContext.getBean("driverDAOImpl");
} public void testGetById() {
Driver driver = (Driver) driverDAO.getByID(Driver.class, 1);
System.out.println(driver);
System.out.println("===================");
Car car = driver.getCar();// 这里一直取不到car的值,是怎么回事??!
System.out.println(car);//这里执行没有反应,不知道为什么。
}
}
我的实体类文件是这样的:public class Driver {
// Fields
private Integer id;
private String name;
private String experience;
private String contact;
private String licenseType;
private Integer state;
private String carType;
private Integer age;
private Car car;//所属车辆
private String gender;
省略getter和setter
}
public class Car { // Fields
private Integer id;
private String license;
private String type;
private Float load;
private Float capacity;
private String number;
private Date dispatchDate;
private Integer state;
private Driver driver;//随车司机
省略getter和setter
}
Car.hbm.xml文件
<hibernate-mapping package="com.logistic.entity">
<class name="Car" table="t_car" catalog="logistic">
<id name="id" type="java.lang.Integer">
<column name="car_id" />
<generator class="identity"></generator>
</id>
===省略中间部分
<one-to-one name="driver" class="Driver" property-ref="car"></one-to-one>
</class>
</hibernate-mapping>
Driver.hbm.xml文件
<hibernate-mapping package="com.logistic.entity">
<class name="Driver" table="t_driver" catalog="logistic">
<id name="id" type="java.lang.Integer">
<column name="drv_id" />
<generator class="identity"></generator>
</id>
===省略中间部分
<many-to-one name="car" column="drv_car" class="Car" unique="true" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
数据库:
create table t_car
(
car_id int not null auto_increment comment '车辆ID',
car_license varchar(20) not null comment '车牌号码',
car_type varchar(20) not null comment '车辆类型',
car_load float(2) not null comment '车辆载重',
car_capacity float(2) not null comment '车辆容积',
car_number char(20) comment '车辆编号',
car_dspdate date not null comment '调度时间',
car_state int not null comment '车辆状态',
primary key (car_id)
);
create table t_driver
(
drv_id int not null auto_increment comment '司机ID',
drv_name varchar(20) not null comment '司机姓名',
drv_experience varchar(60) comment '工作经验',
drv_contact varchar(20) not null comment '联系方式',
drv_lcstp varchar(20) not null comment '驾照类型',
drv_state int not null comment '工作状态',
drv_cartype varchar(60) not null comment '适驾车型',
drv_age int not null comment '司机年龄',
drv_car int comment '所驾车辆',
drv_gender char(2) not null comment '司机性别',
primary key (drv_id)
);alter table t_driver add constraint FK_Reference_3 foreign key (drv_car)
references t_car (car_id) on delete restrict on update restrict;
下面的单元测试有没有问题? 不过,我试过存储和查询是没有问题的。如果我要通过Car就可以知道Driver的信息,通过Driver也可以知道Car的信息,我要怎么做?
public class TestDriverDAO extends TestCase {
private ApplicationContext applicationContext;
private CarDAO carDAO;
private DriverDAO driverDAO; @Override
protected void setUp() throws Exception {
super.setUp();
applicationContext = new FileSystemXmlApplicationContext(
"src/application-*.xml"); carDAO = (CarDAO) applicationContext.getBean("carDAOImpl");
driverDAO = (DriverDAO) applicationContext.getBean("driverDAOImpl");
} public void testGetById() {
Driver driver = (Driver) driverDAO.getByID(Driver.class, 1);
System.out.println(driver);
System.out.println("===================");
Car car = driver.getCar();// 这里一直取不到car的值,是怎么回事??!
System.out.println(car);//这里执行没有反应,不知道为什么。
}
}
我的实体类文件是这样的:public class Driver {
// Fields
private Integer id;
private String name;
private String experience;
private String contact;
private String licenseType;
private Integer state;
private String carType;
private Integer age;
private Car car;//所属车辆
private String gender;
省略getter和setter
}
public class Car { // Fields
private Integer id;
private String license;
private String type;
private Float load;
private Float capacity;
private String number;
private Date dispatchDate;
private Integer state;
private Driver driver;//随车司机
省略getter和setter
}
Car.hbm.xml文件
<hibernate-mapping package="com.logistic.entity">
<class name="Car" table="t_car" catalog="logistic">
<id name="id" type="java.lang.Integer">
<column name="car_id" />
<generator class="identity"></generator>
</id>
===省略中间部分
<one-to-one name="driver" class="Driver" property-ref="car"></one-to-one>
</class>
</hibernate-mapping>
Driver.hbm.xml文件
<hibernate-mapping package="com.logistic.entity">
<class name="Driver" table="t_driver" catalog="logistic">
<id name="id" type="java.lang.Integer">
<column name="drv_id" />
<generator class="identity"></generator>
</id>
===省略中间部分
<many-to-one name="car" column="drv_car" class="Car" unique="true" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
数据库:
create table t_car
(
car_id int not null auto_increment comment '车辆ID',
car_license varchar(20) not null comment '车牌号码',
car_type varchar(20) not null comment '车辆类型',
car_load float(2) not null comment '车辆载重',
car_capacity float(2) not null comment '车辆容积',
car_number char(20) comment '车辆编号',
car_dspdate date not null comment '调度时间',
car_state int not null comment '车辆状态',
primary key (car_id)
);
create table t_driver
(
drv_id int not null auto_increment comment '司机ID',
drv_name varchar(20) not null comment '司机姓名',
drv_experience varchar(60) comment '工作经验',
drv_contact varchar(20) not null comment '联系方式',
drv_lcstp varchar(20) not null comment '驾照类型',
drv_state int not null comment '工作状态',
drv_cartype varchar(60) not null comment '适驾车型',
drv_age int not null comment '司机年龄',
drv_car int comment '所驾车辆',
drv_gender char(2) not null comment '司机性别',
primary key (drv_id)
);alter table t_driver add constraint FK_Reference_3 foreign key (drv_car)
references t_car (car_id) on delete restrict on update restrict;
解决方案 »
- DispatchAction 到底怎么使用的啊
- 想把表单里的数据直接发送到指定的邮箱里去 可有什么好的方法
- 修改、删除功能并发处理 SOS
- Hibernate查询视图问题,非常急!求解
- 关于Extjs的Ext.onReady的问题
- 我要建一个tomcat项目,总是划红叉,大概是tomcat那还不对,咋办?
- (急)tapestry中的实现处理删、修改,要怎么做?
- eclipse3M8 build project的简单问题
- cmp大数据量查询的问题
- Unable to instantiate Action, testAction, 求前辈指点
- struts2中jsp页面怎么获得action当中的List
- 从页面中抓取的内容填充到word中,换行和缩进不变
在Hibernate 级联查询中,* to many 中,只要后者是many 的,查询前者,默认都不会级联查询many 一方,因为这样效率很低。(除非设置级联查询为true,不推荐使用;或者使用 Hibernate.initialize(Ojb) 此方法,也可以 )
如果没有设置级联查询,而直接获取多的一方,都会抛出session is close 异常.
在* to one 不管前者是one 还是many 都会级联查询到 one 的一方。
在保存的时候必须是先保存Driver对象,因为他有级联保存,而Car没有级联的保存
我需要怎么修改才能达到目的?
如果我要通过Car就可以知道Driver的信息,通过Driver也可以知道Car的信息。
在<many-to-one>里面的lazy设置成false就好了