2011-02-28 67 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

相关问题