JPA 2

2012-06-11 5 views
0

에서 Entity 클래스로 매핑 된 3 또는 4 웨이 many-to-many 연관을 생성하는 방법은 Spring 3.1, hibernate 4.0.1.FINAL 및 spring-data-jpa 1.0.2.RELEASE로 작업하고 있습니다. 예를 들어 class Aclass B 사이에 many-to-many이 있고 그 중 하나가 ABMap으로 매핑되었다고 가정 해 봅시다. 또한 class Cclass D 사이에 또 ​​다른 many5to many가 CDMap으로 매핑됩니다. 내가 클래스 ABMapIDJPA 2

@Embeddable 
public class ABMapID{ 
    private String aID; 
    private String bID; 
} 
//... setters and getters 

그렇게 매핑 자체가 이제

@Entity 
public class ABMap { 

@Id 
@AttributeOverrides({ 
    @AttributeOverride(name = "aID", column = @Column(name = "a_id",insertable = false, updatable = false)), 
    @AttributeOverride(name = "bID", column = @Column(name = "b_id", insertable = false,updatable = false)) 
}) 
private ABMapID ID; 
@ManyToOne(targetEntity = A.class) 
@JoinColumn(name = "a_id",insertable = false,updatable = false) 
private A a; 

@ManyToOne(targetEntity = B.class) 
@JoinColumn(name = "b_id", insertable = false, updatable = false) 
private B b; 
//.... setters and getters 
} 

의 우리가 ABMapACDMapID이 도움으로 구성되어 ACDMap로 변경하고 싶은 말은하자 아래 @Embeddable 주석이 있고, CDMapID (자체는 cID, dID로 구성됩니다). org.hibernate.AnnotationException : ACDMap에서 외래 키 다스의 CDMap 열 잘못된 번호가 은 나의 새 연결 ID는 ACDMapID

@Embeddable 
public class ACDMapID { 
    private String aID; 
    private CDMapID cdmapID; 

} 

and the entity is mapped like so 

@Entity 
public class ACDMap { 
    @Id 
@AttributeOverrides({ 
    @AttributeOverride(name = "aID", column = @Column(name = "a_id",insertable = false, updatable = false)), 
    @AttributeOverride(name = "cdmapID", column = @Column(name = "dcmap_id", insertable = false,updatable = false)) 
}) 
    private ACDMapID ID; 

} 

그래서이 날이 오류

에 의한 줄 실행입니다 . 2이어야합니다.

이 매핑을 수행하는 방법은 무엇입니까? 나는 CDMap을 그대로 유지하고 싶다.

답변

0

JPA의 개념을 이해하지 못하는 것 같습니다. ID를 프로그래밍 방식으로 처리하고 대신 Object를 처리해야합니다.

삽입 가능한 개체의 ID를 기반으로 동적 연결을 원합니다. 아마도 그러한 구조는 평이한 Hibernate에서 가능할 것이다. 그러나 확실히 JPA에는 없다.

JPA의 요점은 데이터베이스 관계가 아니라 객체를 다루는 것입니다. 이 두 가지 측면을 혼합하자마자 지옥이 헐렁 할 것이므로 JPA 사람들은 그러한 혼합물을지지하지 않기로 결정했기 때문에 그들을 비난 할 수는 없습니다.

1

나는 그에게 한 발을 줄 것이라고 생각했다. 여기에 결과가있다. (이론적으로는 그렇게 시도하지 않았다.)

@Entity 
public class A 
{ 
    @Id 
    private Long id; 

    @ManyToMany 
    @JoinTable(name = "A_B", joinColumns={ 
     @JoinColumn(name = "a_id") 
    }, inverseJoinColumns = { 
     @JoinColumn(name = "b_id") 
    }) 
    private Collection<B> collectionOfB; 

    @ManyToMany 
    @JoinTable(name = "A_C_D", joinColumns={ 
     @JoinColumn(name ="a_id") 
    }, inverseJoinColumns = { 
     @JoinColumn(name = "c_id"), 
     @JoinColumn(name = "d_id") 
    }) 
    private Collection<ACD> collectionOfCD; 
} 

@Entity 
public class B 
{ 
    @Id 
    private Long id; 

    @ManyToMany(mappedBy = "collectionOfB") 
    private Collection<A> collectionOfA; 
} 

@Entity 
public class C 
{ 
    @Id 
    private Long id; 

    @ManyToMany 
    @JoinTable(name = "C_D", joinColumns={ 
     @JoinColumn(name = "c_id") 
    }, inverseJoinColumns = { 
     @JoinColumn(name = "d_id") 
    }) 
    private Collection<D> collectionOfD; 
} 

@Entity 
public class D 
{ 
    @Id 
    private Long id; 

    @ManyToMany(mappedBy = "collectionOfD") 
    private Collection<C> collectionOfC; 
} 

@Entity 
@Table(name = "C_D") 
public class CD 
{ 
    @EmbeddedId 
    private CDPK key; 

    @MapsId("cId") 
    @ManyToOne 
    private C c; 

    @MapsId("dId") 
    @ManyToOne 
    private D D; 
} 

@Embeddable 
public class CDPK 
{ 
    @Column(name = "c_id") 
    private Long cId; 
    @Column(name = "d_id") 
    private Long dId; 
} 

는 정말 같은 테이블을 사용하여 테이블 C_DJoinTable를 사용하여 Entity 있기 때문에이 작품 모르겠어요.

| A |  | A_B   |  | B | 
| id |------<| a_id | b_id |>-----| id | 
    | 
    | 
    |  | A_C_D    | 
    \----<| a_id | c_id | d_id | 
       \/  \/ 
       |  | 
       |  | 
    | C |  | C_D   |  | D | 
    | id |----<| c_id | d_id |>-----| id | 
:

은 데이터베이스가 다음과 같이 보일 것입니다 작동하는 경우