gpt4 book ai didi

java - Hibernate 一对一映射的合并问题

转载 作者:行者123 更新时间:2023-12-01 05:48:21 26 4
gpt4 key购买 nike

我有一个类层次结构,在 Hibernate(3.5.6 Final)中使用 JPA 2.0 映射了 InheritanceType.JOINED -

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class A{
private Long id;

@OneToOne
@JoinColumn(name = "foo_id", nullable = false)
private Foo foo;
...
}

@Entity
@PrimaryKeyJoinColumn(name = "B_ID")
public class B{
...
}

@Entity
@PrimaryKeyJoinColumn(name = "C_ID")
public class C{
...
}

Foo 实体是 -

@Entity
public class Foo{
@Id
private Long id;

@OneToOne(cascade = CascadeType.ALL, mappedBy = "foo")
private A a

// getters / setters omitted
}

现在,我将实体 FooB 的引用保存到字段“a”。后来我想通过类 C 的引用来更新 Foo 的实例到属性“a”,所以我所做的是 -

loadedFooInstance.setA(new C());
entityManager.merge(loadedFooInstance);

但我注意到 - 它不会删除在分配 C 之前分配给该 Foo 对象的原始 B 对象。因此,我需要手动删除分配给该 Foo 实例的 A 的所有引用 在分配新的之前。
但我相信 hibernate 必须有办法处理这种情况,而我在映射中遗漏了一些东西。我的映射有什么问题吗?或者这种映射可以通过更好的方式实现,所以我不需要处理这样的手动工作。

最佳答案

您的一对一关系由 A 方管理,而不是由 Foo 方管理。所以需要改变A端的关系(因为hibernate只关注管理关系的一侧)

A old = loadedFooInstance.getA();
oldA.setFoo(null);
C c = new C();
c.setFoo(loadedFooInstance);
/*and it is good practic to update foo too*/
loadedFooInstance.setA(c);

另一种方法是改变管理关系的一方:

public abstract class A{
...
@OneToOne(mappedBy = "a")
private Foo foo;
...
}

public class Foo{
...
@OneToOne
@JoinColumn(name = "a_id", nullable = false)
private A a
...
}

但这也会改变您的数据库布局!

关于java - Hibernate 一对一映射的合并问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5327238/

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