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();

子から親を設定しましたが、列はまだ空で、null になります。これを回避する方法は?

4

2 に答える 2

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 のカスケード機能が残りの作業を行います

于 2012-11-16T07:06:42.043 に答える
0

粘着性に見えますが、試してみてください

public void setDriver(Driver driver){
    this.driver = driver;
    driver.setLicense(this);
}
于 2012-11-16T06:51:21.863 に答える