gpt4 book ai didi

java - JPA 引用重构

转载 作者:行者123 更新时间:2023-12-04 07:04:21 25 4
gpt4 key购买 nike

我将一些类从标准 SQL 重构为 JPA/ORM 用法。在大多数情况下,对象具有“真实”引用,但有时对其他对象的引用仅由未经检查的数据库 id 引用给出(没有外键,只是一个简单的字符串与对另一个表 id 的引用)。

代码如下所示:

@Entity
public final class myEntity implements Serializable {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "ID")
private String id;

@OneToOne
@JoinColumn(name = "OBJREF", nullable = false)
private otherObject objReference; /* Nice object reference */

@Column(name = "OTHEROBJREF")
private String otherObjReference; /* Damn db reference used by legacy code */
}

我应该如何处理 otherObjReference?该属性由需要带有字符串的静态 getter/setter 构造的遗留系统使用!如果我继续使用该 ID,我将遇到 JPA 查询问题,并且我不能简单地分配一个对象并将其持久化。

我考虑过使 String transient 并与 @PrePersist 和 @PreLoad 一起加载“真实”对象引用,这样我就可以同时使用两者。但是在这些方法中,我无法访问 EntityManager (在这种情况下,持久性不应该是这个 pojo 的任务......如果我在这里加载引用,它闻起来像是糟糕的设计)。

因为“otherObjReference”是私有(private)的,所以我也可以使用 getter 和 setter 从我的真实引用中加载数据。但是其他层使用对象,因此当它们调用 getOtherObjReference() 方法时它们会失败,因为它们没有数据库连接来加载对象。

最佳答案

也可以(至少使用 toplink 要点)将同一列映射到两个字段,只要只有一个是可更新和可插入的。

@Column(name = "OBJREF", nullable = false)
private String otherObjectId;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "OBJREF", nullable=false, updatable=false, insertable=false)
private OtherObject otherObject;

在您的 setOtherObject方法也可以设置 otherObjectId .这种方法的唯一问题是,如果您只设置 String 字段,则该对象只会在您从数据库保存并重新加载实体时更新。

关于java - JPA 引用重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1357732/

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