2010-05-24 6 views
1

나는 단방향 일대 다 서로를 가진 두 개의 클래스가 있습니다.일대 다 관계에서의 CascadeType 문제

public class Offer{ 
    ... 
    @OneToMany(cascade=CascadeType.ALL) 
    @JoinTable(name = "Offer_Fields", 
    joinColumns = 
    @JoinColumn(name = "OFFER_ID"), 
    inverseJoinColumns = 
    @JoinColumn(name = "FIELDMAPPER_ID")) 
    private Set<FieldMapper> fields = new HashSet<FieldMapper>(); 
} 


@Entity 
@Table(name = "FieldMapper") 
public class FieldMapper implements Serializable { 
    @Id 
    @Column(name = "FIELDMAPPER_ID") 
    @GeneratedValue 
    private int id; 
    @OneToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name = "multilingual_field_fk") 
    private MultiLingual field; 
    @OneToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name = "multilingual_value_fk") 
    private MultiLingual value; 
} 

데이터베이스에 FieldMapper 세트와 함께 오퍼를 저장하려고합니다. 내 OneToMany에 CascadeType.ALL을 사용하면,이 오류가있어 :

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions 

을 내가 다른 것으로 CascadeType를 변경할 때이 오류가있어 :

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.RCSTT.library.FieldMapper 

을하고 여기에 내가 제안을 저장할 곳이다 :

public void insert(Offer offer) throws SQLException { 
    Session session = HibernateUtil.getSession(); 
    Transaction tx = session.beginTransaction(); 
    session.save(offer); 
    tx.commit(); 
    session.close(); 
} 

나는 다른 곳에서 세션을 사용하지 않습니다.

tx.commit(); 라인 스로우 설명 예외.

도움 주셔서 감사합니다.

+0

호기심에서 벗어나 테이블의 동일한 열 집합과 관련된 일대 다 관계가 있습니까? 나는 이것이 수학적으로 가능한 방법을 궁금해하고있다. –

+0

No. 각 클래스는 자체 테이블에 고유 한 열을 가지고 있지만 제 경우에는 관계를 관리하기 위해 조인 테이블이 만들어집니다 (조인 테이블없이 일대 다 관계를 만들 수 있음). –

+0

글쎄, FieldMapper 클래스의 코드를 게시하는 것이 유용 할 수 있습니다. 웬일인지, 나는 이것이 ManyToMany 관계라고 생각한다. –

답변

0

첫 번째 예외는 이것이 매핑/엔티티에 문제가 아니라 오브젝트 라이프 사이클 또는 Hibernate 세션이 처리되는 방법과 관련이 있다고 생각하게 만듭니다.

저장하려는 FieldMappers가 (다른 세션에서) 지속적으로 저장합니까? 먼저 분리해야 할 수도 있습니다.

+0

아니요, 쿠폰을 저장하려고 할 때 자바 코드로 만들었습니다. 그것들은 영속적이지 않습니다. 그래서 cascadeType을 다른 것으로 변경하면, "객체는 저장되지 않은 일시적인 인스턴스를 참조합니다". 그것은 그들이 끈기가 없다는 것을 의미합니다. –

+0

최대 절전 모드 세션은 어떻게 처리됩니까? 이 예외는 콜렉션 (필드)이 동시에 두 개의 열린 세션과 연관되어있을 때 발생할 수 있습니다. 예를 들어, 한 세션을 사용하여 오퍼를 조회 한 다음 다른 세션을 사용하여 동일한 오퍼를 저장하려고하면이 예외가 발생합니다. –

+0

아니요, 쿠폰도 코드로 생성됩니다. 최대 절전 모드 세션은 어떻게 처리됩니까? –