Bar*_* NL 2 jpa foreign-keys primary-key many-to-one jpa-2.0
我定义了以下实体:
@Entity
public class Child implements Serializable
{
@Id
@ManyToOne(cascade = CascadeType.ALL)
public Parent parent;
@Id
public int id;
}
@Entity
public class Parent
{
@Id
public int id;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用以下代码持久化 Child 时:
Parent p = new Parent();
p.id = 1;
Child c1 = new Child();
c1.id = 1;
c1.parent = p;
em.persist(c1);
Run Code Online (Sandbox Code Playgroud)
Hibernate 抛出“违反参照完整性约束”错误:
Caused by: org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK3E104FC802AAC0A: PUBLIC.CHILD FOREIGN KEY(PARENT_ID) REFERENCES PUBLIC.PARENT(ID) (1)"; SQL statement:
insert into Child (parent_id, id) values (?, ?) [23506-171]
Run Code Online (Sandbox Code Playgroud)
我相信这是因为它首先插入 Child 然后是 Parent,而我希望它先插入 Parent。知道如何更改插入顺序,或者如何以其他方式解决这个问题吗?
更新:请注意,此方法不符合 JPA,但使用 Hibernate 细节(请参阅hibernate 文档中的第5.1.2.1节复合标识符)
更新:我只想保留 Child c1 并自动将持久级联级联到 Parent p(此更新是对下面@Alf 的回答的反应)。
em.persist(p);
em.persist(c1);
Run Code Online (Sandbox Code Playgroud)
更新
我认为问题在于您的代码不符合 JPA 标准。尝试使用embeddedId,它对我有用。
@Embeddable
public class ChildPK implements Serializable {
private int parentId;
private int childId;
// getters and setters
}
@Entity
public class Child implements Serializable {
@EmbeddedId
public ChildPK id = new ChildPK();
@MapsId( "parentId" )
@ManyToOne
public Parent parent;
}
Parent p = new Parent();
p.id = 1;
Child c1 = new Child();
c1.id.setChildId( 1 );
c1.parent = p;
em.persist( c1 );
Run Code Online (Sandbox Code Playgroud)
我认为它也适用@IdClass
,但我从未使用过它。
归档时间: |
|
查看次数: |
9466 次 |
最近记录: |