我有一个带有引用对象 ItemVersion 的实体公司,我使用 JPA (eclipselink) 作为持久层。此处给出了代码摘录:
@Entity
public class Company{
private String instance;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_item_version_id")
private ItemVersion itemVersion;
}
@Entity
public class ItemVersion{
private String comment;
...
}
我可以创建一个 Company 对象并将其持久化。我还可以找到新对象,更新属性“实例”并将其持久化,一切正常。当我更改引用的 ItemVersion 对象的属性“comment”时,此更改不会存储在服务器端。
创建/更新测试代码如下所示:
final EventBus eventBus = new SimpleEventBus();
final AftdRequestFactory requestFactory = GWT.create(AftdRequestFactory.class);
requestFactory.initialize(eventBus);
final CompanyRequest request = requestFactory.companyRequest();
final CompanyProxy newCompany = request.create(CompanyProxy.class);
newCompany.setInstance("1");
ItemVersionProxy newVersion = request.create(ItemVersionProxy.class);
newVersion.setComment("first comment");
newCompany.setItemVersion(newVersion);
request.persist().using(newCompany).fire(new Receiver<Void>() {
@Override
public void onSuccess(Void arg0) {
final CompanyRequest request2 = requestFactory.companyRequest();
Request<CompanyProxy> p = request2.findCompany(1L).with("itemVersion");
p.to(new Receiver<CompanyProxy>() {
@Override
public void onSuccess(CompanyProxy response) {
final CompanyRequest request3 = requestFactory.companyRequest();
final CompanyProxy editableCompany2 = request3.edit(response);
editableCompany2.setInstance("2");
editableCompany2.getItemVersion().setVersionNumber(2);
request3.persist().using(editableCompany2).fire(new Receiver<Void>() {
@Override
public void onSuccess(Void arg0) {
// persist company version
System.out.println("company updated");
但是,“instance”和“comment”的更新通过了网络(检查了客户端和服务器之间的wireshark),但是在Company的persist方法中,引用的ItemVersion对象及其“comment”属性在“instance”时不会更新" 被更新,因此旧评论被存储。
Company 的 persist 方法如下所示:
public void persist() throws PersistenceException {
EntityManager em = emf.createEntityManager();
EntityTransaction tx = null;
try {
tx = em.getTransaction();
tx.begin();
Company existingEntity = findCompany(getId());
if (existingEntity == null) {
em.persist(this);
} else {
setId(existingEntity.getId());
em.merge(this);
}
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
throw e;
}
使用搜索解决方法并根据搜索结果使用 em.persist 或 em.merge 是必要的,因为简单的持久化不存储任何更新。