Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JPA中为实体的链接对象设置值_Jpa_Eclipselink - Fatal编程技术网

如何在JPA中为实体的链接对象设置值

如何在JPA中为实体的链接对象设置值,jpa,eclipselink,Jpa,Eclipselink,我有一个实体“A”,它有一个到实体“B”的链接 我有一个A对象和它链接的B对象都已经从数据库中查询过了(通过单独的查询),现在我需要将B设置为A。 我只做了aObj.setB(bObj),并在日志中看到它导致再次从数据库中查询B对象(日志中声明调用了ReadObjectQuery。可能它从缓存中查询对象-这无关紧要-问题是发生了一些冗余操作)。 不管A和B的状态如何,它都会发生,它们可以被管理或分离,查询总是发生 我知道我可以在一次查询中查询A,但由于遗留代码,我有一个A实例和B实例,需要将B设

我有一个实体“A”,它有一个到实体“B”的链接

我有一个A对象和它链接的B对象都已经从数据库中查询过了(通过单独的查询),现在我需要将B设置为A。 我只做了
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;
    }
}