2011-02-28 43 views
1

我有3個表:Project,User和Role。現在我想要一個具有嵌入式密鑰id_project,id_user的表格Project2User2Role。使用一對多關係爲3個表創建ORMapping

我在所有三個實體中都使用了@OneToMany關係,但我認爲我不能像這樣構建它。

而且我也嘗試通過我自己構建一個Project2User2Role實體類,但是我必須創建一個沒有@ManyToOne關係的idclass。

該解決方案的外觀如何?

回答

1

reference manual說,你可以嵌入嵌入的ID內的關係:

雖然JPA不支持休眠 您可以將自己的關聯 直接在嵌入式ID組件

因此,您應該定義一個類型爲Project2User2RoleId的Project2User2Role實體:

@Entity 
public class Project2User2Role { 
    @EmbeddedId 
    private Project2User2RoleId id; 

    public User getUser() { 
     return this.id.getUser(); 
    } 

    public Project getProject() { 
     return this.id.getProject(); 
    } 

    // ... 
} 

的Project2User2RoleId類是這樣的:

@Embeddable 
public class Project2User2RoleId { 
    @ManyToOne(optional = false) 
    @JoinColumn(name = "project_id") 
    private Project project; 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "user_id") 
    private User user; 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "role_id") 
    private Role role; 

    // constructor 
    // getters 
    // equals and hashCode 
} 
+0

謝謝!我用你的解決方案。使用雙向映射(用戶實體:@OneToMany(mappedBy =「user」) private List Project2User2Role;),現在我得到以下異常:Create:org.hibernate.AnnotationException:mappedBy引用未知的目標實體屬性: ... Project2User2Role.user in ... project2User2Role – nogamawa 2011-02-28 14:58:52

+0

未經測試,但嘗試mappedBy =「id.user」。如果語法與用於HQL/JPQL中的屬性的語法類似,它應該起作用 – 2011-02-28 16:12:12

1

對於JPA 1你不能使用實體的ID。 從JPA 1規格(2.1.14)

主鍵(或場或一個複合主鍵的屬性 )應該是以下類型的一個 :任何Java 原語類型;任何原始包裝 類型; java.lang.String中; java.util.Date; java.sql.Date。

如果你正在使用JPA 1,你有兩個選擇:

A.您將需要創建一個Project2User2Role帶有自動生成的ID字段,你必須指定它作爲你的實體的ID。然後,您可以將關係添加到項目,用戶和角色,並指定其相應的註釋映射(ManyToOne)。 例子:

@Entity 
public class Project2User2Role { 

    private Long id; 

    private Project project; 

    private User user; 

    private Role role; 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQPRUSROLID") 
    @SequenceGenerator(name="SEQPRUSROLID", sequenceName="SEQPRUSROLID", allocationSize=1) 
    public Long getId() { 
     return id; 
    } 

    @ManyToOne 
    public Project getProject() { 
     return project; 
    } 

    @ManyToOne 
    public User getUser() { 
     return user; 
    } 

    @ManyToOne 
    public Role getRole() { 
     return role; 
    } 
    //the setters 
} 

B.您可以創建實體類和繼續使用的複合ID但JPA 1規格,所以你需要使用爲基礎列不能指定實體的ID例如:

@Entity 
public class Project2User2Role { 

    @EmbeddedId 
    private Project2User2RoleId project2User2RoleId; 

    @ManyToOne 
    @JoinColumn(insertable=false, updatable = false) 
    private Project project; 
    @ManyToOne 
    @JoinColumn(insertable=false, updatable = false) 
    private User user; 
    @ManyToOne 
    @JoinColumn(insertable=false, updatable = false) 
    private Role role; 

    //getters/setters 
} 

    @Embeddable 
    class Project2User2RoleId { 
     private Long projectId; 
     private Long userId; 
     private Long roleId; 

    } 

對於JPA 2

C.您可以指定實體的id的例子和定義請閱讀JPA 2.0規範2.4:http://jcp.org/aboutJava/communityprocess/final/jsr317/index.html 2.2.3 Hibernate文檔: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-identifier

相關問題