2017-12-08 11 views
2

저는이 포럼을 처음 접하고 최대 절전 모드입니다. 최대 절전 모드의 다 대일 매핑에 문제가 있습니다. 최대 절전 모드 외래 키가 ref 테이블의 모든 필드를 업데이트 중입니다.

@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
@JoinColumn(name = "DTE_ID") 
@NotNull 
private Dte raisedByDte; 

내가 주 객체와 외래 키가 DTE_ID이다에서 사용하고있는 코드입니다. 하지만 저장하려고하면 참조 된 테이블의 모든 필드가 업데이트됩니다. 내가 DTE_MASTERS의 업데이트를 제한 할
@Entity 
@Table(name = "DTE_MASTERS", uniqueConstraints = @UniqueConstraint(columnNames = "DTE_NAME")) 
public class Dte { 

    @Id 
    @Column(name="DTE_ID", updatable = false, nullable = false) 
    private int dte_id; 
    @Column(name="DTE_NAME") 
    private String dte_name; 

    public Dte() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 
    public Dte(int dte_id, String dte_name) { 
     super(); 
     this.dte_id = dte_id; 
     this.dte_name = dte_name; 
    } 
    public int getDte_id() { 
     return dte_id; 
    } 
    public void setDte_id(int dte_id) { 
     this.dte_id = dte_id; 
    } 
    public String getDte_name() { 
     return dte_name; 
    } 
    public void setDte_name(String dte_name) { 
     this.dte_name = dte_name; 
    } 

가 좀 몸이를 통해 저를 인도 해주십시오 ..can 삽입하고 때 다음과 같이 내 참조 오브젝트는?

답변

0

매핑에서 계단식 옵션을 제거해야합니다. 상위 개체에 대해 수행 된 것과 동일한 작업을 적용합니다.

@ManyToOne(fetch = FetchType.EAGER) 
: 당신이 주요 개체에 merge()를하고 있다는 것을 추측하고 .. 그 옵션과 함께 merge() (엔티티가 새없는 경우 어떤이 업데이트를 초래하는)도 Dte 의존성에 호출됩니다

또한, Dte 엔티티 내의 일시적이지 않은 필드가 주 엔티티로로드 된 경우 모든 변경 사항은 트랜잭션이 끝날 때 암시 적으로 적용됩니다.

session.evict(dte);을 수행하여 트랜잭션 방식 내에서 수행 된 변경 사항이 데이터베이스에 유지되지 않도록해야합니다.

+0

DTE 엔티티의 메인 엔티티로로드 된 비 일시적인 필드가 트랜잭션 끝날 때 모든 변경 사항이 암시 될 것이라는 점을 명심하여 감사드립니다. session.detach (dte)를 수행해야하는 것을 방지하려면 다음을 수행하십시오. 따라서 트랜잭션 방식 내에서 수행 된 변경 사항은 데이터베이스에 유지되지 않습니다. – SRI

+0

그래서 .. 일단 트랜잭션 내에서 엔티티를 검색하면 트랜잭션이 끝날 때까지 영속 컨텍스트 내에있게됩니다 (사용자가 evict를 호출하지 않는 한). 이제 개체 상태에 대한 모든 변경 사항이 데이터베이스에 플러시됩니다. 업데이트/saveOrUpdate를 사용했는지 여부와 관계 없음 –

+0

확실한 @Maciej Kowalski. 빠른 응답과 안내에 대해 감사드립니다. – SRI