0

我有以下情况:

@Entity
class A{ 
  @Id
  @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
  private Long aId;
  @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
  private B b;
  ...
}
@Entity
class B{
  @Id
  private A a;
  ...
}

换句话说:A和B之间存在OneToOne关联。B是一个弱实体,它的Id是从A类派生的。

如本文所述,我已经测试了一些解决方案,例如在 @OneToOne 下添加 @PrimaryKeyJoinColumn 。但是我收到了这个错误:“org.hibernate.id.IdentifierGenerationException:必须在调用 save() 之前手动分配此类的 ID:B”
我不知道在这种情况下是否相关,但我使用的是 Oracle 11g .

更新

我认为我的方式是正确的。这是我的问题的实际状态:

@Entity
class A{ 
  @Id
  @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
  private Long aId;
  @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
  @PrimaryKeyJoinColumn(name="aId")
  private B b;
  ...
}
@Entity
class B{
  @Id
  @OneToOne
  @JoinColumn(name="aId)
  private A a;
  ...
}

现在的错误有点不同:

java.sql.SQLException: ORA-00904: "B"."A": invalid identifier  

它试图在表 B 中找到列 A(而不是 AID)。我不知道如何指定列名是 B.AID 而不是 BA

4

2 回答 2

2

我按照这个链接解决了我的问题

正确的答案是:

@Entity
public class A {

  @Id
  @GeneratedValue
  @Column(name = "aId")
  private Long id;

  @OneToOne(fetch = FetchType.LAZY, optional=false, cascade = CascadeType.ALL, mappedBy = "a")
  private B b;
  ... 
} 


@Entity
@org.hibernate.annotations.GenericGenerator(name="a-primarykey", strategy="foreign", parameters={@org.hibernate.annotations.Parameter(name="property", value="a")})
public class B {

  @Id
  @GeneratedValue(generator = "a-primarykey")
  @Column(name = "aId")
  private Long id;

  @OneToOne
  @PrimaryKeyJoinColumn
  private A a;
  ...
} 
于 2010-11-21T15:21:06.473 回答
1

你在实体 B 上试过吗?

@Entity class B {
  @Id @OneToOne 
  @JoinColumn(name = "table_a_id") //put the correct column name for A's pk here
  private A a;
  ....
}
于 2010-11-21T08:20:21.570 回答