如何在JPA中为实体的链接对象设置值
我有一个实体“A”,它有一个到实体“B”的链接 我有一个A对象和它链接的B对象都已经从数据库中查询过了(通过单独的查询),现在我需要将B设置为A。 我只做了如何在JPA中为实体的链接对象设置值,jpa,eclipselink,Jpa,Eclipselink,我有一个实体“A”,它有一个到实体“B”的链接 我有一个A对象和它链接的B对象都已经从数据库中查询过了(通过单独的查询),现在我需要将B设置为A。 我只做了aObj.setB(bObj),并在日志中看到它导致再次从数据库中查询B对象(日志中声明调用了ReadObjectQuery。可能它从缓存中查询对象-这无关紧要-问题是发生了一些冗余操作)。 不管A和B的状态如何,它都会发生,它们可以被管理或分离,查询总是发生 我知道我可以在一次查询中查询A,但由于遗留代码,我有一个A实例和B实例,需要将B设
aObj.setB(bObj)
,并在日志中看到它导致再次从数据库中查询B对象(日志中声明调用了ReadObjectQuery。可能它从缓存中查询对象-这无关紧要-问题是发生了一些冗余操作)。
不管A和B的状态如何,它都会发生,它们可以被管理或分离,查询总是发生
我知道我可以在一次查询中查询A,但由于遗留代码,我有一个A实例和B实例,需要将B设置为A。是否可以在没有冗余和数据库查询的情况下进行设置
我使用的是EclipseLink 2.4.2如果您不希望JPA为您维护链接,请不要将它们与对象引用进行映射,并将“B_ID”直接设置为整数或其他值。否则,当您调用setB时,JPA必须执行一些维护,以确保只有更改被持久化并推送到数据库。如果您想避免某些访问,当您最初使用fetch join查询时,获取关联的Bs。@Chris在任何事务之外都不可能吗?EntityManager必须跟踪更改,无论是在事务之内还是之外-您可以在任何时候将其加入到一个事务中,它将刷新所有更改。@Chris感谢您的回复。我正在尝试重写应用程序以使用JPA,而不是客户编写的旧ORM。ORM无法执行某种类型的获取连接,这就是为什么通常的方法是分别查询所有实例,然后将它们适当地设置为彼此。我无法删除映射链接,因为在许多地方,代码希望执行
aObj.getB()
将查询数据库。如果我不使用fetch join并且不删除链接映射,那么调用aObj.setB()
时就不可能阻止额外的查询。如果ist已经链接到持久性上下文和数据库中的B,为什么需要将B链接到A?链接应该已经存在,因为JPA要求始终保持同一关系的双方。
@Entity
public class A{
private B b;
...
@ManyToOne(fetch = FetchType.LAZY, targetEntity = B.class)
@JoinColumn(name = "B_ID", insertable = false, updatable = false)
public B getB() {
return b;
}
}