eclipselink를 사용하여 기본 JPA 설정을 수행 중입니다. 나는 물건의 재고량을 관리하는 주체가있다. 이 항목의 재고 내역을 추적하고 싶으므로 모든 업데이트를 통해 새로운 기록 항목을 만들 수도 있습니다.EntityManager.merge()가 관련 엔티티를 지속하지 않음
문제는 새로운 History 엔터티를 @PreUpdate
메서드의 히스토리 목록에 추가 할 때 Wine 엔터티와 함께 유지되지 않습니다. merge()
또는 @PrePersist
메서드를 호출하기 전에 수동으로 History 엔터티를 추가하면 예상대로 작동합니다. 세터의 역사 항목을 추가하여 나는 현재 해결이 History.java
@Entity
public class History implements Serializable {
@Id
@GeneratedValue
private long id;
@Column
private int oldAmount;
@Column
private int newAmount;
@ManyToOne(cascade = CascadeType.ALL)
private Wine wine;
//getters & setters
}
Wine.java
@Entity
public class Wine implements Serializable {
@Id
@GeneratedValue
private long id;
@Transient
private int oldAmount;
@Column
private int amount;
@OneToMany(mappedBy = "wine", cascade = CascadeType.ALL)
private List<AmountHistory> history;
//getters & setters
@PostLoad
@PostUpdate
@PostPersist
private void onLoad() {
oldAmount = amount;
}
@PrePersist
private void onPersist() {
final History history = new History();
history.setOldAmount(0);
history.setNewAmount(amount);
history.setWine(this);
this.history = new ArrayList<>();
this.history.add(history);
}
@PreUpdate
private void onUpdate() {
if (oldAmount != amount) {
final History history = new History();
history.setOldAmount(oldAmount);
history.setNewAmount(amount);
history.setWine(this);
this.history.add(history);
}
}
}
:
다음
내 코드입니다 금액에 대한 방법이지만, 나는 또한 Hist를 만들기 때문에이 해결책에 의해 확신을 못한다. ory 엔티티가 호출되지 않을 때merge()
이 호출됩니다. 이 문제를 해결하려면 무엇을해야합니까? 아니면 왜 이런 일이 일어 났는지 설명 할 수 있습니까?
외래 키가 없습니다. 두 테이블 간의 관계를 만들려면 소유자 테이블 (기록)에 외래 키 열이 있어야합니다. – Kalyan
병합은 지속성 및 업데이트를 모두 관리 할 수 있습니다. 일시적인 인스턴스 인 경우 엔터티를 유지하고 관리되는 인스턴스를 반환하고, 분리 된 경우 업데이트 된 인스턴스를 업데이트하고 반환합니다. 어쩌면 당신은 일시적인 인스턴스에서 merge를 호출하고 있으므로 prepersist 핸들러 만 호출되고있을 것입니다. – Shailendra