3

我定义了以下实体:

@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;
}

当我尝试使用以下代码坚持一个孩子时:

Parent p = new Parent();
p.id = 1;

Child c1 = new Child();
c1.id = 1;
c1.parent = p;

em.persist(c1);

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]

我相信这是因为它首先插入子项,然后插入父项,而我希望它先插入父项。知道如何更改插入顺序,或者如何以其他方式解决此问题吗?

更新:请注意,此方法不符合 JPA,但使用 Hibernate 细节(请参阅第5.1.2.1节。hibernate文档中的复合标识符)

更新:我想只需要持久化 Child c1 并自动将持久级联到 Parent p (此更新是对下面@Alf 的回答的反应)。

4

4 回答 4

5
em.persist(p);
em.persist(c1);

更新

我认为问题在于您的代码不符合 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 );

我认为它也适用@IdClass,但我从未使用过它。

于 2013-07-11T12:39:04.653 回答
1

我认为你的观点是对的。

你首先需要坚持孩子然后父母。

于 2013-07-11T11:50:19.147 回答
1

巴里

Java中的ManyToOne关系是源对象具有引用另一个目标对象的属性并且(如果)该目标对象与源对象具有反向关系,它将是OneToMany关系。

JPA 还定义了 OneToOne 关系,它类似于 ManyToOne 关系,只是反向关系(如果已定义)是 OneToOne 关系

JPA 中 OneToOne 和 ManyToOne 关系之间的主要区别在于,ManyToOne 始终包含从源对象表到目标对象表的外键,而作为 OneToOne 关系,外键可能在源对象表中,也可能在目标对象的表。

你可以看到下面的例子

@Entity
public class Student {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="DEPT_ID")
private Department department;

 //getter and setter
}

@Entity
public class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
 //getter and setter

}


Student student = new Student();
student.setName("prateek");
em.persist(student);


Department dept = new Department();
dept.setName("MCA KIIT");
student.setDepartment(dept);
em.flush();
于 2013-07-12T05:35:23.570 回答
0

我想这是一个更简单的解决方案:

@Entity
public class Child implements Serializable {
    @Id
    @JoinColumn(name = "id")
    private String id;

    @ManyToOne
    @PrimaryKeyJoinColumn
    private Parent parent;

    private String otherMember;    
}
于 2019-05-24T13:18:36.090 回答