簡體   English   中英

Hibernate批注使用復合主鍵一對一映射單向關聯

[英]Hibernate annotations to map one to one unidirectional association with composite primary key

我有兩個表:report和flyleaf。 報告由“ id”和“ index”標識,這是flyleaf表中的外鍵和主鍵。

這些表的架構為:

CREATE TABLE `report` (
   `id` int(11) NOT NULL,
   `index` varchar(5) NOT NULL,
   `nb_page` int(11) DEFAULT NULL
); 
ALTER TABLE `report` ADD PRIMARY KEY (`id`,`index`);

CREATE TABLE `flyleaf_t` (
   `id` int(11) NOT NULL,
   `index` varchar(5) NOT NULL,
   `title` varchar(30) DEFAULT NULL,
   `author` varchar(30) DEFAULT NULL,
   `checker` varchar(30) DEFAULT NULL
);
ALTER TABLE `flyleaf` ADD PRIMARY KEY (`id`,`index`);
ALTER TABLE `flyleaf` ADD CONSTRAINT `flyleaf_ibfk_1` FOREIGN KEY (`id`,`index`) REFERENCES `report` (`id`, `index`);

我使用Hibernate注釋以單向方式映射此關聯。 當我使用簡單的鍵(非復合鍵)時,它顯然工作良好,但是當我嘗試使用復合鍵時,消息“ org.hibernate.TypeMismatchException”被拋出:“為類lgmi_cr.Flyleaf提供了錯誤類型的ID。預期:類lgmi_cr.Flyleaf,獲得了類lgmi_cr.Report“

如果有人已經看到相同的案例,或者對如何以單向一對一的方式表示此關聯有任何想法,將不勝感激。

編輯:這就是我的ID做映射的方式

@Entity
@Table(name="report")
public class Report implements Serializable{

    @Id
    @Column(name = "id")
    private int id;

    @Id
    @Column(name = "index")
    private String index;

    @OneToOne 
    @JoinColumns({@JoinColumn(name="id", referencedColumnName="id"),
            @JoinColumn(name="index", referencedColumnName="index")})
    private Flyleaf flyleaf;
...

@Entity
@Table(name="flyleaf")
public class Flyleaf implements Serializable {

    @Id
    @Column(name = "id")
    private int id;

    @Id
    @Column(name = "index")
    private String index;
....

我得到了這個異常“ org.hibernate.TypeMismatchException:為類lgmi_cr.Flyleaf提供了錯誤類型的ID。預期:類lgmi_cr.Flyleaf,得到了類lgmi_cr.Report”

我希望您可以分享如何在Hibernate中映射這些關系? 這就是我要做的:

1)使用@Embeddable注解將每個組合表映射為單獨的類對象,例如:

@Embeddable
public class ReportPK implements Serializable {

  @Basic(optional = false)
  @Column(name="id")
  private int id;
  @Basic(optional = false)
  @Column(name="index")
  private String index;
...

實體類如下所示:

@Table(name="report")
public class Report implements Serializable {

  @EmbeddedId
  protected ReportPK id;
...

2)在flyleaf實體類中,可以將單向映射添加為:

@OneToOne
  @JoinColumns({
    @JoinColumn(name="id",
      referencedColumnName="id"),
    @JoinColumn(name="index",
      referencedColumnName="index"),
  })
  private Report report;
...

如果這樣做沒有幫助,也許您可​​以更具體一些。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM