gpt4 book ai didi

java - Eclipselink 获取递归实体给出不完整的结果

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

我遇到以下问题,我认为这与缓存有关,但我无法让它工作。

配置:Glassfish 3.1、JPA 2、EJB3.1、Eclipselink 2.2。

在一个过程中,我生成一个包含多个 UpdatePackageFiles 的 UpdatePackage。这些文件链接到父 UpdatePackage,但也与其自身具有递归关系。例如,我有一个包,它是包含多个文件的 ZIP bundle 。该过程在数据库中创建 UpdatePackage 和文件。到目前为止一切顺利。

之后,第二个进程开始(不同的进程、新事务等)。然后我得到包含所有文件的 UpdatePackage,但是,问题是:文件之间的内部层次结构不完整。因此,如果我得到 TOP UpdatePackageFile,该文件有一个子文件,但该子文件不包含任何子文件,尽管应该有 2 个。注意,数据库是正确的。

如果我重新启动应用程序服务器并再次运行第二个进程,层次结构就会完整。

我运行以下查询

Query query = em.createQuery("SELECT pck FROM UpdatePackageSubscription pck "
+ " LEFT JOIN FETCH pck.updatePackage"
+ " JOIN pck.updatePackage g LEFT JOIN FETCH g.updatePackageFiles "
+ " JOIN g.updatePackageFiles q LEFT JOIN FETCH q.updatePackageFiles"
+ " JOIN q.updatePackageFiles z LEFT JOIN FETCH z.updatePackageFiles"
+ " WHERE pck.subscription.eps.id = :id "
+ " AND pck.subscription.applicationSubcategory.shortName = :shortName"
+ " AND pck.status != :done AND pck.status != :obsolete "
+ " ORDER BY pck.updatePackage.id");

query.setParameter("id", id);
query.setParameter("shortName", shortName);
query.setParameter("done", UpdatePackageSubscriptionStatusType.DONE);
query.setParameter("obsolete", UpdatePackageSubscriptionStatusType.OBSOLETE);
query.setHint("javax.persistence.cache.storeMode", "REFRESH");

您可以看到我显式运行较低级别的层次结构连接来强制获取。我还将缓存设置为刷新。我还将以下内容添加到我的 persistence.xml

<property name="eclipselink.query-results-cache" value="false" />

我有以下实体,全部设置为“EAGER fetching”。

@Entity
@Table(name = "UPDATE_PACKAGE_SUBSCRIPTION")
public class UpdatePackageSubscription implements Serializable {
private UpdatePackage updatePackage;

// bi-directional many-to-one association to UpdatePackage
@ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
@JoinColumn(name = "UPP_ID", nullable = false)
public UpdatePackage getUpdatePackage() {
return this.updatePackage;
}

public void setUpdatePackage(UpdatePackage updatePackage) {
this.updatePackage = updatePackage;
}
}

@Entity
@Table(name = "UPDATE_PACKAGE")
public class UpdatePackage implements Serializable {
private List<UpdatePackageFile> updatePackageFiles = new ArrayList<UpdatePackageFile>();
private List<UpdatePackageSubscription> updatePackageSubscriptions = new ArrayList<UpdatePackageSubscription>();

@OneToMany(mappedBy = "updatePackage", fetch = FetchType.EAGER)
@OrderBy
public List<UpdatePackageFile> getUpdatePackageFiles() {
return this.updatePackageFiles;
}

public void setUpdatePackageFiles(List<UpdatePackageFile> updatePackageFiles) {
this.updatePackageFiles = updatePackageFiles;
}

// bi-directional many-to-one association to UpdatePackageSubscription
@OneToMany(mappedBy = "updatePackage", cascade = { CascadeType.ALL })
@PrivateOwned
public List<UpdatePackageSubscription> getUpdatePackageSubscriptions() {
return this.updatePackageSubscriptions;
}

public void setUpdatePackageSubscriptions(List<UpdatePackageSubscription> updatePackageSubscriptions) {
this.updatePackageSubscriptions = updatePackageSubscriptions;
}
}

@Entity
@Table(name = "UPDATE_PACKAGE_FILE")
public class UpdatePackageFile implements Serializable {
private UpdatePackage updatePackage;
private UpdatePackageFile updatePackageFile;
private List<UpdatePackageFile> updatePackageFiles;

// bi-directional many-to-one association to UpdatePackage
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "UPP_ID", nullable = false)
public UpdatePackage getUpdatePackage() {
return this.updatePackage;
}

public void setUpdatePackage(UpdatePackage updatePackage) {
this.updatePackage = updatePackage;
}

// bi-directional many-to-one association to UpdatePackageFile
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_FILE_ID")
public UpdatePackageFile getUpdatePackageFile() {
return this.updatePackageFile;
}

public void setUpdatePackageFile(UpdatePackageFile updatePackageFile) {
this.updatePackageFile = updatePackageFile;
}

// bi-directional many-to-one association to UpdatePackageFile
@OneToMany(mappedBy = "updatePackageFile", fetch = FetchType.EAGER)
@PrivateOwned
@OrderBy
public List<UpdatePackageFile> getUpdatePackageFiles() {
return this.updatePackageFiles;
}

public void setUpdatePackageFiles(List<UpdatePackageFile> updatePackageFiles) {
this.updatePackageFiles = updatePackageFiles;
}
}

所以,我的查询显然是正确的,但层次结构仍然没有完全获取。

最佳答案

你必须维持双方的关系。您很可能设置的是 ManyToOne,但没有添加到 OneToMany。

看, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

您也可以禁用共享缓存,但您的代码仍然会是错误的,并且您仍然会损坏持久性上下文中的对象。

看, http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

关于java - Eclipselink 获取递归实体给出不完整的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10819718/

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