【问题标题】:Hibernate one to one mapping bi directional休眠一对一映射双向
【发布时间】:2012-11-15 10:37:59
【问题描述】:
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();

虽然我从子级设置了父级,但该列仍然是空的,我得到空值。 如何避免这种情况?

【问题讨论】:

  • 使用驱动程序保存许可证后,您是否从数据库中加载了带有许可证的驱动程序?
  • 是的,我做到了,但没用。
  • 那么在这种情况下,我想我需要查看完整的代码。你能发布第二部分的代码吗?

标签: hibernate mapping one-to-one


【解决方案1】:

让我们从更具描述性的映射开始,稍后我们可以删除部分,无论如何这将被重新定义为默认值。

有一个描述比我的摘录更详细。请看一下: 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"
           , parameters=@Parameter(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 级联功能将由我们来完成

【讨论】:

    【解决方案2】:

    看起来俗气,但尝试一下

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      相关资源
      最近更新 更多