我对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;

解决方案 »

  1.   

    首先,你的配置文件有问题,在Driver.hbm.xml文件中的是many to one 的配置。所以获取不到Driver。  
    在Hibernate 级联查询中,* to many 中,只要后者是many 的,查询前者,默认都不会级联查询many 一方,因为这样效率很低。(除非设置级联查询为true,不推荐使用;或者使用 Hibernate.initialize(Ojb) 此方法,也可以 )
    如果没有设置级联查询,而直接获取多的一方,都会抛出session is close 异常.
    在* to one 不管前者是one  还是many 都会级联查询到 one 的一方。
      

  2.   

    你可能在保存的时候没有给双方都set对方的应用吧!
    在保存的时候必须是先保存Driver对象,因为他有级联保存,而Car没有级联的保存
      

  3.   


    我需要怎么修改才能达到目的?
    如果我要通过Car就可以知道Driver的信息,通过Driver也可以知道Car的信息。
      

  4.   

    解决了  
    在<many-to-one>里面的lazy设置成false就好了