2011-02-06 8 views
3

두 JPA 엔티티간에 단방향 일대 다 매핑을 생성하려고합니다. 내 ChatRoom 클래스에서 에 User을 나타내는 Vector<User> 유형의 개체가 있습니다. userId (User 클래스)을 기반으로 일대 다 매핑을 만들려고합니다. 여기EclipseLink/JPA @OneToMany Backpointer 카디널리티 오류

@Entity 
public class ChatRoom { 
    @Id 
    @GeneratedValue 
    private int chatRoomID; 

    @OneToMany(mappedBy="userID") 
    private Vector<User> users; 

    // A no-argument constructor is required for EclipseLink to instantiate the persistence object properly. 
    public ChatRoom() {} 

    // Getter/Setter section 
} 

사용자 클래스입니다 : 여기 내 예제 코드는

@Entity 
public class User { 
    @Id 
    @GeneratedValue 
    private int userID; 

    private String username; 

    // Getter/Setter section 
} 

이클립스에서 이러한 실체에서 테이블을 생성하려고, 나는 다음과 같은 오류 얻을 :

Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.EntityManagerSetupException 
Exception Description: Predeployment of PersistenceUnit [ChatJPA] failed. 
Internal Exception: Exception [EclipseLink-7244] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: An incompatible mapping has been encountered between [class iosoa.entity.ChatRoom] and [class iosoa.entity.User]. This usually occurs when the cardinality of a mapping does not correspond with the cardinality of its backpointer. 
    at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126) 

이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 당신의 도움을 주셔서 감사합니다.

+0

[링크] (http://stackoverflow.com/questions/3515756/unidirectional-relationship-inentent-bean-jpa)에는 @JoinTable을 사용하는 방법에 대한 답변이 포함되어 있지만 제 경우에는 다음 오류가 발생합니다. 예외 설명 : [users] 속성은 ValueHolderInterface 유형으로 선언되지 않았지만 해당 매핑은 간접 참조를 사용합니다. 매핑 : org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping [users]' –

답변

6

몇 가지,

귀하의 mappedBy 잘못하는 OneToMany의 mappedBy는 ManyToOne해야합니다. ManyToOne을 다시 추가하거나 @JoinTable을 사용하는 것을 권장합니다. 원하지 않으면 @JoinColumn과 mappedBy를 사용할 수 없습니다.

벡터는 JPA에서 유효하지 않으므로 List, Set 또는 Map을 사용해야합니다. 구현 클래스로 Vector를 사용할 수 있습니다. 정말로 Vector를 사용하고 싶다면 EclipseLink가 이것을 지원할 것이지만 매핑 EAGER를 만들어야합니다.

1

내 생각에 mappedBy 주석 문제입니다. 그것은되어야한다 : "개인 ChatRoom chatRoom;" 귀하의 사용자 클래스입니다. 그리고 mappedBy에서이 변수를 작성하십시오. 오후 8시 30 분 P.S. 관계에 CharRoom에 대한 링크가 없다면 반드시 조인 테이블이 있어야합니다. 그런 다음 mappedBy없이 @JoinTable 주석과 @OneToMany를 사용해야합니다.

+0

@JoinTable 접근법을 시도했지만 다음과 같은 예외가 발생합니다 : 예외 설명 : [사용자] 속성은 ValueHolderInterface 유형으로 선언되지 않지만 매핑은 간접 참조를 사용합니다. 매핑 : org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping [users]' –

+0

당신의 관계 스키마와 시도한 코드를 알려주시겠습니까? – damluar

+0

@damular,'@JoinColumn (name = "user_id", referencedColumnName = "chatroom_id")'을 사용하고 내 ID에 이름을 지정했습니다. 문제는'List','Map' 또는'Set'을 사용하지 않으면 자신의 간접 지정을 지정해야한다는 것입니다. 나는 이것을 아직 어떻게하는지 모르겠다. –