gpt4 book ai didi

mysql - 在 Hibernate 中持久化循环引用

转载 作者:行者123 更新时间:2023-11-29 00:10:16 24 4
gpt4 key购买 nike

我有以下情况:

@Entity
class Foo {

@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="parent_id")
Foo father;

@OneToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="left_child_id")
Foo left_child;

@OneToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="right_child_id")
Foo right_child;

}

我想坚持其中的许多。在将它们放入列表之前,我设置了它们之间的关系,并将它们放入列表中,以便 parent 始终出现在 child 之前。当我坚持时,我会:

tx=session.beginTransaction();
List<Foo> foos=new LinkedList<Foo>();
//Some code here to establish relationships
enter code here
for (Foo foo : foos){
session.save(foo);
}
tx.commit();

但是通过这样做我收到以下错误:错误:无法添加或更新子行:外键约束失败(package.Foo,CONSTRAINT FK_r1pg1dvb3vnuml2e7tw1x2doc 外键 (left_child_id) 引用 Foo (id`)).

我是否可以坚持保留循环引用?如果可以的话,我想那样做。欢迎任何关于如何坚持这一点的想法。

最佳答案

我试过了,但没有收到任何错误,这是我的代码:

Foo.java

@实体公开课 Foo {

@Id
@GeneratedValue
private int id;

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "parent_id")
Foo father;

@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "left_child_id")
Foo left_child;

@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "right_child_id")
Foo right_child;

// Setters & Getters

保存Foo对象的程序:

    Session session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();

Foo father = new Foo();
Foo leftChild = new Foo();
Foo rightChild = new Foo();

Foo foo = new Foo();
foo.setFather(father);
foo.setLeft_child(leftChild);
foo.setRight_child(rightChild);

session.persist(foo);
session.getTransaction().commit();

数据库中的数据:

SQL> select * from foo;

ID PARENT_ID LEFT_CHILD_ID RIGHT_CHILD_ID
---------- ---------- ------------- --------------
2
3
4
1 2 3 4

现在,如果我尝试保存多个 Foo 对象,它们也会被正确保存:

private static void saveElements() {
Session session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();

Foo foo1 = getFooObject();
Foo foo2 = getFooObject();

Foo foo = new Foo();
Foo father = new Foo();
Foo leftChild = new Foo();
Foo rightChild = new Foo();

foo.setFather(father);
foo.setLeft_child(leftChild);
foo.setRight_child(rightChild);

foo.setFather(foo1.getFather());
foo.setLeft_child(foo2.getFather());

session.persist(foo1);
session.persist(foo2);
session.persist(foo);
session.getTransaction().commit();

}

private static Foo getFooObject() {
Foo foo = new Foo();
Foo father = new Foo();
Foo leftChild = new Foo();
Foo rightChild = new Foo();

foo.setFather(father);
foo.setLeft_child(leftChild);
foo.setRight_child(rightChild);
return foo;
}



SQL> select * from foo;

ID PARENT_ID LEFT_CHILD_ID RIGHT_CHILD_ID
---------- ---------- ------------- --------------
2
3
4
1 2 3 4
6
7
8
5 6 7 8
10
9 2 6 10

10 rows selected.

关于mysql - 在 Hibernate 中持久化循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25514560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com