【问题标题】:Hibernate multiple relationships doesn't work休眠多个关系不起作用
【发布时间】:2013-10-13 08:46:02
【问题描述】:

当我最终创建 2 个一对一关系时,仅保存 2 个中的一个,另一个变为空。

在 sql 跟踪中你可以看到 MFUITVOERINGJOIN 只保存 2 个 id,而它应该保存 3 个 :S

这里有什么问题吗?

@Entity
@Table(name = "STUD1630651.MFUITVOERING")
public class Uitvoering {

@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="HIBERNATE_SEQUENCE_UITVOERING")
@Column(name = "ID")
private int id;

@Column(name = "DATUM")
private String datum;

@Column(name = "SCHOUWBURG")
private String schouwburg;

@OneToOne(cascade=CascadeType.ALL)  
@JoinTable(name="MFUITVOERINGJOIN",joinColumns=
{@JoinColumn(name="UITVOERINGID")},
inverseJoinColumns={@JoinColumn(name="DIRIGENTID")})
private Dirigent dirigent;

@OneToOne(cascade=CascadeType.ALL)  
@JoinTable(name="MFUITVOERINGJOIN",joinColumns=
{@JoinColumn(name="UITVOERINGID")},inverseJoinColumns=
{@JoinColumn(name="MUZIEKSTUKID")})
private Muziekstuk muziekstuk;


public Uitvoering(String datum, String schouwburg, Dirigent dirigent, Muziekstuk muziekstuk){
    this.datum = datum;
    this.schouwburg = schouwburg;
    this.dirigent = dirigent;
    this.muziekstuk= muziekstuk;
}

//GETTERS AND SETTERS

SQL 跟踪:

Hibernate: select dirigent0_.ID as ID1_3_0_, dirigent0_.KLASSE as KLASSE2_3_0_, dirigent0_.LAND as LAND3_3_0_,  dirigent0_.NAAM as NAAM4_3_0_, dirigent0_.RICHTING as RICHTING5_3_0_ from STUD1630651.MFDIRIGENT dirigent0_ where  dirigent0_.ID=?
Hibernate: select muziekstuk0_.ID as ID1_5_1_, muziekstuk0_.GENRE as GENRE2_5_1_, muziekstuk0_.TITEL as    TITEL3_5_1_, muziekstuk0_1_.INSTRUMENTID as INSTRUME2_0_1_, instrument1_.ID as ID1_4_0_, instrument1_.HOEVEELHEID   as HOEVEELH2_4_0_, instrument1_.NAAM as NAAM3_4_0_ from STUD1630651.MFMUZIEKSTUK muziekstuk0_ left outer join    MFMUZIEKSTUKJOIN muziekstuk0_1_ on muziekstuk0_.ID=muziekstuk0_1_.MUZIEKSTUKID left outer join    STUD1630651.MFINSTRUMENT instrument1_ on muziekstuk0_1_.INSTRUMENTID=instrument1_.ID where muziekstuk0_.ID=?
Hibernate: select HIBERNATE_SEQUENCE_UITVOERING.nextval from dual 
Hibernate: insert into STUD1630651.MFUITVOERING (DATUM, SCHOUWBURG, ID) values (?, ?, ?)
Hibernate: insert into MFUITVOERINGJOIN (MUZIEKSTUKID, UITVOERINGID) values (?, ?)

【问题讨论】:

    标签: java oracle hibernate annotations one-to-one


    【解决方案1】:

    我认为您在错误的地方使用了@OneToOne 注释。
    据我所知,当两个表具有 the same primary key 列时,使用一对一注释。

    对于表 A(父)中的记录,一对一显示表 B(子)中必须有一个且只有一个记录。
    在数据库级别,这是通过 having a foreign key of A in B table, when this foreign key column(s) in B table is(are) marked as primary key of B 实现的。
    从技术上讲,子表中不可能有多个一对一关系。

    因此,在您的问题MFUITVOERING 中,作为子表有其拥有的主键,称为 ID(具有序列值的字段)。
    MFUITVOERINGMFUITVOERINGJOIN的两个外键是ManyToOne关系的表示。
    需要使用@ManyToOne注解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      相关资源
      最近更新 更多