java - 仅存储一个与 Hibernate 和 Spring 的双向 OneToOne 关系的实体
问题描述
情况:
- 我正在使用 Spring(数据)和 Hibernate。
- 我有两个具有双向
@OneToOne
关系的实体。 - 两者共享相同的密钥(使用
@PrimaryKeyJoinColumn
)
问题:
- 我想从数据库中加载 A 和 B
- 我想临时修改B(只在内存中)
- 我想对 B 进行计算
- 我想存储A,而不是B
用代码制定:
a = repositoryForA.findById(a);
b = a.getB();
a.setAttribute(abc);
b.setAttribute(xyz);
repositoryForA.save(a);
然而,我看到的行为是始终存储 A 和 B(通过测试和休眠日志验证)
我试过的:
- 在保存 A 之前分离 B 之前:
entityManager.detach(b); repository.save(a)
- 无传播
@OneToOne(cascade={})
- 保存前设置
a.setB(null)
和分离
这可能吗?这种关系可能不适合这个目的吗?
实体:
@Entity
public class A {
@Id
@GeneratedValue
protected Long id;
@OneToOne
@PrimaryKeyJoinColumn
private B b;
// Some attributes...
}
@Entity
public class B {
@Id
protected Long id;
@OneToOne(mappedBy = "b")
@MapsId
@JoinColumn(name = "id")
private A a;
// Some attributes...
}
解决方案
我使用了@K.Nicholas 提出的类似解决方案。我刚刚创建了一个实体副本B
来进行临时计算。我没有打电话repositoryForB.save(b)
。因此,在保存时只存储了自身a
的属性。a
推荐阅读
- reporting-services - 在 Visual Studio 中运行 RDL 时,跟踪调试 ODP.NET 不会产生输出
- c# - 如何在负载均衡器后面正确设置 AspNet Core 2 身份验证?
- javascript - 发送/接收带参数的 GET 请求
- java - 如何不匹配此正则表达式中的第一个空字符串?
- sql - 无法解决需要子查询的问题
- powershell - 在不修改 Fiddler 规则的情况下转储 fiddler 上的会话
- python - “x”在“for x in range(10):”中是什么意思?
- python - 将 python 包转换为单个可导入文件
- openstreetmap - 匹配服务响应中节点 ID 的纬度/经度
- python-3.x - 指数曲线拟合 Python