2013-08-28 3 views
1

두 객체 간의 내 관계를 삭제하는 동면 문제가 있습니다. 첫 번째는 다음과 같습니다Hibernate는 @ManyToMany 관계를 지연로드와 함께 삭제합니다

@Entity 
    @Table(name="A") 
    public class A extends AbstractBO{ 

     private List<B> b; 

     @Override 
     @Id 
     public String getId(){ 
      return id; 
     } 

     public void setId(String id) { 
     this.id = id; 
     } 

     @ManyToMany(targetEntity=B.class, fetch=FetchType.LAZY) 
     @JoinTable(name="A_B", joinColumns={@JoinColumn(name="A_id")},inverseJoinColumns={@JoinColumn(name="B_id")}) 
     public List<B> getBs() { 
      return b; 
     } 

     public void setBs(List<B> b) { 
     this.b = b; 
     } 
    } 

그리고 두 번째 :

@Entity 
@Table(name="B") 
public class B extends AbstractBO { 

    private List<A> a; 

    @Override 
    @Id 
    public String getId(){ 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @ManyToMany(targetEntity=A.class, fetch=FetchType.LAZY, mappedBy="b") 
    public List<A> getAs() { 
     return a; 
    } 

    public void setAs(List<A> a) { 
     this.a = a; 
     } 
} 

내있는 hibernate.cfg.xml은 다음과 같습니다

<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password">****</property> 
    <property name="hibernate.connection.release_mode">auto</property> 
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="show_sql">true</property> 
    <property name="hibernate.enable_lazy_load_no_trans">true</property> 
    <property name="hibernate.generate_statistics">false</property> 

    <property name="transaction.factory_class"> 
     org.hibernate.transaction.JDBCTransactionFactory 
    </property> 
    <property name="hibernate.cache.provider_class"> 
     org.hibernate.cache.HashtableCacheProvider 
    </property> 

    <!-- JDBC connection pool (use the built-in) --> 
    <property name="connection.pool_size">2</property> 
    <property name="current_session_context_class">thread</property> 

    <property name="hibernate.hbm2ddl.auto">update</property> 

    <mapping class="de.test.A"/> 
    <mapping class="de.test.B"/>  

    </session-factory> 
</hibernate-configuration> 

지금까지, 모든 것이 잘 작동합니다. DB와 모든 자식에 유지 된 모든 객체를 저장, 업데이트, 삭제 및로드 할 수 있습니다. 프론트 엔드에 A 유형의 객체를로드하고 getBs()을 호출하면 올바른 하나와 모든 하위 항목이 표시됩니다. 그러나 최대 절전 모드는 "최대 절전 모드 : A_B에서 삭제 (B_id =?") SELECT 문 바로 뒤에. 이것은 객체와 그 자식 사이의 모든 관계를 삭제합니다. 이 B 인 경우를 "EAGER"로 변경하면 모든 것이 정상적으로 작동합니다. 최대 절전 모드는 아이들 개체의 getAs()이 호출되지 않는다는 사실에 대한 화제를 제거합니다. 내가 사용하고, 그런데

@JoinTable(name="A_B", joinColumns={@JoinColumn(name="B_id")}, inverseJoinColumns={@JoinColumn(name="A_id")}) 
    public List<A> getAs() {[...] 

:

  • 를 4.2.4 최종
  • JSF 2.0
  • JPA 최대 절전

    은 또한에 클래스 BgetAs()을 변경 시도 2.0

많은 관련 기사를 읽었으며 캐스케이드 (Cascade) 등 다른 제안을 시도했습니다. B의 생성자에서 getAs()을 호출하는 것에 대해 생각했지만이 모든 것이 내 문제를 해결하지 못합니다. 내 응용 프로그램을 debbuging 동안

나는 클래스 B의 게터에 하나 개의 행을 추가 :

public List<A> getAs() { 
    if(a!=null) a.size(); 
    return a; 
} 

아무것도 변경되지 않습니다 a.size()를 호출. 그래서 갑자기 모든 것이 작동 할 때 나는 당황했다. 결론적으로,이 응용 프로그램은 이제이 "수정 사항"과 함께 작동합니다. 그러나 누군가가 저에게 좀 더 일반적인 해결책을 줄 수 있다면 고맙겠습니다.

답변

0

hibernate.enable_lazy_load_no_trans이 활성화되어 있고 버그가 여전히 열려 있으므로 나는 당신이 HHH-7971의 희생자라고 생각합니다. 나는 당신에게 이것에 대한 적절한 해결책을 줄 수 없다. 만약 행동이이 버그의 결과라면, 해결 방법을 사용할 수있다.

최대 절전 모드 프록시가 그 순간에 초기화되기 때문에 a.size()이 수정되었다고 생각합니다. 따라서 Hibernate.initialize(a)을 사용하는 것이 더 적절할 것입니다. 또한 나는 getter에서 그렇게하지 않을 것이지만, getter라고 부르는 곳에서 할 것입니다.

+0

왜 Hibernate.initialize (a)를 사용할 것을 권장합니까? 나는 당신의 제안을 시도하고 나중에이 질문을 업데이트 할 것입니다. – joverflow

+0

반면에 그것은 훨씬 더 읽기 쉽고 모두가 라인을 읽을 때 무슨 일이 벌어지는 지 알고 있고 다른 한편으로는 당신은'null' 체크를 할 필요가 없습니다. – user1983983

+0

불행히도 Hibernate.initialize (a)는 그 문제를 해결하지 못합니다.내 응용 프로그램은 프론트 엔드에서 바로 getter를 호출하기 때문에 getter에서 구현했습니다. 제안을 실행하는 동안 관계가 다시 삭제되었습니다. – joverflow

관련 문제