Hibernate는 트랜잭션 메소드에서 수정 된 엔티티를 유지하므로 세션 # evict (엔티티)를 사용하여 피할 수있다.Hibernate에서 영속 컨텍스트로부터 엔티티 내의 엔티티를 분리
퍼시스턴스 컨텍스트에서 분리하면 해당 컨텍스트도 분리됩니다. 주소가 트랜잭션의 끝에서 지속 될 것입니다, 나는 사용자 개체를 분리하는 경우
@Entity
public class User extends BaseEntity{
@Column(name = "email")
private String email;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<Address> addresses;
// getters and setters
}
@Entity
public class Address extends BaseEntity{
@Column(name = "email")
private String email;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private User user;
// getters and setters
}
만에 주소 객체를 변경 : 예를 들어
, 나는이 수업을? 이처럼 :
은User user = userDAO.getById(id);
session.evict(user);
Address address = user.getAddresses().get(0);
address.setNumber(number);
addressDAO.saveOrUpdate(address); //will this work?
왜 사용자를 (명시 적으로) 분리하겠습니까? JPA는로드 된 모든 엔티티의 복사본을 메모리에 보관합니다. 트랜잭션이 커밋되면 Persistence Context를 통해 실행되고 수정 된 엔티티를 찾습니다. 이렇게하면 사용자를 수정하지 않으면 사용자에게 아무런 변화가 없습니다. –
사용자를 변경하는 줄을 생략했습니다. 예제에 추가해야 할 수도 있습니다. 하지만 일괄 업데이트를하고 있기 때문에 분리하고 있으므로 각 엔티티를 개별적으로 저장하지 않아도됩니다. –
당신이''CascadeType.DETACH/ALL''을 전파시키지 않는 한 각각의 엔티티에 대해 분리가 이루어집니다. saveOrUpdate()는 주소 변경 사항이 데이터베이스에 도달 할 수 있도록 충분해야합니다 (단, JPA와 마찬가지로 작동하는 경우 관리 엔티티의 변경 사항이 트랙이므로 필요하지 않음). 그러나 CascadeType.UPDATE가있는 엔티티를 업데이트하는 경우 분리 된 엔티티로 전달되는 문제가 발생할 수 있다고 생각합니다. * 대량 업데이트 * 란 무엇입니까? 나는 500MB 크기의 거래를 해왔고 결코 분리 할 필요가 없었다. –