참조 된 ItemVersion 개체가있는 엔티티 회사가 있고, JPA (eclipselink)를 지속성 레이어로 사용합니다. 코드 추출은 여기에 주어진다 :GWT RequestFactory : 계단식 객체에 업데이트가 전파되지 않음
@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;
...
}
나는 회사 객체를 만들고 그것을 유지할 수있다. 나는 또한 새로운 객체를 찾고, 속성 "instance"를 업데이트하고 그것을 지속 할 수있다. 참조 된 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");
그러나, "예"와 "주석"에 대한 업데이트가 와이어를 넘어 (체크 느릅 나무 클라이언트와 서버 사이의 와이어 샤크)하지만 지속에 Company의 메소드에서 인스턴스가 업데이트되고 따라서 이전 주석이 저장되는 동안 참조 된 ItemVersion 객체와 해당 "comment"속성은 업데이트되지 않습니다.
는 회사의 방법을 보이는 계속 같은 :
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이 필요하다 검색에 따라와 주변 작업 업데이트.
서버 측에서 OpenSessionInView, 즉 요청 당 세션 패턴을 사용하고 있습니까? (또는 다른 말로하면 JPA의 EntityManager의 수명을 어떻게 관리하고 있습니까?) –
위의 Company.persist() 코드를 추가했습니다. 나는 또한 문제의 근본 원인이 서버 측에 있다고 생각한다. 내 이해에 따르면, 나는 Company.persist()에서 모든 업데이트 된 참조를 포함하여 업데이트 된 개체를 볼 수 있지만 내가 말했듯이, 나는 ItemVersion이 아닌 Company의 업데이트 만 볼 수 있습니다. 지금 당장은 RequestFactory *와 * JPA를 함께 사용하는 완전한 소스 코드 예제를 찾지 못했습니다. 링크를 제공 할 수 있습니까? 많은 감사합니다. – Georg