2012-11-15 152 views
1
public class Driver { 

    @OneToOne 
    private License license; 

    //.. getter setter 
}; 

public class License { 

    @OneToOne(mappedBy='license') 
    private Driver driver; 

    //.. getter setter 
} 

我通过此映射在Db的驱动程序表中获取连接列license_id。问题是:休眠一对一映射双向

Driver driver = new Driver(); 
// save driver then get it etc... 

License license = new License(); 
license.setDriver(driver); 
// save license... 

driver.getLicense(); 

尽管我从child设置父项,列仍然是空的,我得到null。 如何避免这种情况?

+0

节省许可证与驱动程序后,你从数据库许可加载的驱动程序? – RAS

+0

是的,我做到了,但没有奏效。 – thetux4

+0

那么在那种情况下,我想我需要看完整的代码。你可以发布第二部分的代码吗? – RAS

回答

0

看起来俗气,但尝试

public void setDriver(Driver driver){ 
    this.driver = driver; 
    driver.setLicense(this); 
} 
1

让我们开始更多的描述映射,我们以后可以去除的部分,这将是无论如何relaized为默认值。

有一个描述比我的提取更详细。请它来看一看: http://viralpatel.net/blogs/hibernate-one-to-one-mapping-tutorial-using-annotation/

此基础上,让我们扩展映射是这样的:

司机

public class Driver { 

    @Id 
    @GeneratedValue 
    @Column(name="driver_id") 
    private Long driverId;  

    // cascade will do the job for us 
    @OneToOne(mappedBy="driver", cascade=CascadeType.ALL) 
    private License license; 

许可证

public class License { 

    @Id 
    @Column(name="driver_id", unique=true, nullable=false) 
    @GeneratedValue(generator="gen") 
    @GenericGenerator(name="gen", strategy="foreign" 
      , [email protected](name="property", value="driver")) 
    private Long driverId; 

    @OneToOne 
    @PrimaryKeyJoinColumn 
    private Driver driver 
    ... 

当插入新的价值,我们可以明确设置两端:

Driver driver = new Driver(); 
License license = new License(); 
// set both ends 
license.setDriver(driver); 
driver.setLicense(license); 

// Just save the Driver. the cascade will do the rest 

现在Hibernate的级联功能,将其余的为我们