2012-06-11 21 views
0

中使用spring 3.1,hibernate 4.0.1.FINAL和spring-data-jpa 1.0.2.RELEASE創建3或4路多對多關聯映射爲實體類。所以我們假設我在class Aclass B之間有many-to-many,我將其映射爲ABMap。我還在class Cclass D之間有另一個多對多映射爲CDMap。 我有一個類ABMapID註釋@Embeddable如何在JPA 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 
} 

現在讓我們說,我們要改變ABMapACDMap其中ACDMapID由與援助, CDMapID(本身由cID,dID組成)。 所以我的新關聯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; 

} 

那麼運行這個給我這個錯誤

產生的原因:org.hibernate.AnnotationException:從ACDMap外鍵闖民宅CDMap有錯號碼列。應該是2

有沒有辦法做那個映射?最好是我想保留CDMap。

回答

0

您似乎並不瞭解JPA的概念。你不應該以編程方式處理ID,而是處理對象。

你想要一個基於嵌入對象中的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; 
} 

我真的不知道這個工程,因爲有一個Entity使用表C_DJoinTable使用同一個表。

如果一切正常的數據庫將是這個樣子:

| 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 |