두 객체 간의 내 관계를 삭제하는 동면 문제가 있습니다. 첫 번째는 다음과 같습니다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 최대 절전
은 또한에 클래스
B
의getAs()
을 변경 시도 2.0
많은 관련 기사를 읽었으며 캐스케이드 (Cascade) 등 다른 제안을 시도했습니다. B
의 생성자에서 getAs()
을 호출하는 것에 대해 생각했지만이 모든 것이 내 문제를 해결하지 못합니다. 내 응용 프로그램을 debbuging 동안
B
의 게터에 하나 개의 행을 추가 :
public List<A> getAs() {
if(a!=null) a.size();
return a;
}
아무것도 변경되지 않습니다 a.size()
를 호출. 그래서 갑자기 모든 것이 작동 할 때 나는 당황했다. 결론적으로,이 응용 프로그램은 이제이 "수정 사항"과 함께 작동합니다. 그러나 누군가가 저에게 좀 더 일반적인 해결책을 줄 수 있다면 고맙겠습니다.
왜 Hibernate.initialize (a)를 사용할 것을 권장합니까? 나는 당신의 제안을 시도하고 나중에이 질문을 업데이트 할 것입니다. – joverflow
반면에 그것은 훨씬 더 읽기 쉽고 모두가 라인을 읽을 때 무슨 일이 벌어지는 지 알고 있고 다른 한편으로는 당신은'null' 체크를 할 필요가 없습니다. – user1983983
불행히도 Hibernate.initialize (a)는 그 문제를 해결하지 못합니다.내 응용 프로그램은 프론트 엔드에서 바로 getter를 호출하기 때문에 getter에서 구현했습니다. 제안을 실행하는 동안 관계가 다시 삭제되었습니다. – joverflow