gpt4 book ai didi

java - 在我的 Play 应用程序中使用 Ebean/JPA,如何删除 OneToOne 关系中的对象?

转载 作者:行者123 更新时间:2023-11-30 11:41:51 27 4
gpt4 key购买 nike

我有以下类(class):

import play.db.ebean.Model;
import javax.persistence.*;

@Entity
public class A extends Model {
@Id
private int id;

/* Other irrelevant properties */

@OneToOne(cascade = CascadeType.ALL, optional = true)
private B b;
}

import play.db.ebean.Model;
import javax.persistence.*;

@Entity
public class B extends Model {
@Id
private int id;

/* Other irrelevant properties */

@OneToOne(mappedBy = "b")
private A a;

@OneToOne(cascade = CascadeType.ALL, optional = false)
private C c;
}

import play.db.ebean.Model;
import javax.persistence.*;

@Entity
public class C extends Model {
@Id
private int id;

/* Other irrelevant properties */

@OneToOne(mappedBy = "c")
private B B;
}

在数据库中,它看起来像这样:

Table    a
Columns id, ... (other irrelevant columns), b_id

Table b
Columns id, ...(other irrelevant columns), c_id

Table c
Columns id, ...(other irrelevant columns)

现在在一个 Controller 方法中(对于那些熟悉 Play 的人)我有一个对象 A,并且想从数据库中删除它的属性“b”。这也应该级联到 c,因此 c 也被删除。这是我目前的做法:

B b = a.getB();
b.delete();

虽然这会引发异常:

[PersistenceException: ERROR executing DML bindLog[] error[Cannot delete or update a parent row: a foreign key constraint fails (databasename.a, CONSTRAINT fk_a_payme_4 FOREIGN KEY (b_id) REFERENCES b (id))]]

基本上可以归结为我正在尝试删除 b,而 a 仍然在 b_id 列中保留对 b 的外键引用,因此我应该首先将该引用设置为 null。

在 Java 中,这转化为:

B b = a.getB();
a.setB(null);
a.update();
b.delete();

这确实将对象 a 中对 b 的引用设置为 null 并正确删除了 b 对象,但 c 并未从数据库中删除。 (为什么?我虽然 cascade 属性会处理这个问题)我发现解决此问题的唯一方法是也显式删除 c,如下所示:

B b = a.getB();
C c = b.getC();

b.setC(null);
b.update();
c.delete();

a.setB(null);
a.update();
b.delete();

虽然我对此不是很满意,因为删除数据库中的两行已经有 8 行代码,如果这张图片中有更多关系,它会更多。

至于我的问题:

如何从 a 中删除 b,以便首先自动删除从 a 到 b 的引用,以及如何确保在删除 b 时也删除 c?

提前致谢!

编辑:迄今为止最好的想法:将 a-b 关系的所有权移至 b。

最佳答案

尝试使用

class A{

......

@JoinColumn(nullable=true)
private B b;

.......
}

有关更多信息,请参阅此问题 What is the difference between @ManyToOne(optional=false) vs. @Column(nullable=false) .

关于java - 在我的 Play 应用程序中使用 Ebean/JPA,如何删除 OneToOne 关系中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12093073/

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