使用OneToMany关系为3个表创建ORMapping

时间:2011-02-28 14:13:05

标签: java hibernate orm jpa entity-relationship

我有3个表:项目,用户和角色。现在我想要一个带有嵌入式密钥id_project,id_user,。的表Project2User2Role。

我在所有三个实体中使用@OneToMany关系尝试了它,但我想我不能像那样构建它。

我还试图自己构建一个Project2User2Role实体类,但是我必须创建一个没有@ManyToOne关系的idclass。

解决方案怎么样?

2 个答案:

答案 0 :(得分:1)

reference manual表示您可以在嵌入式ID中嵌入关系:

  

虽然在JPA,Hibernate中不支持   让你放置你的联想   直接在嵌入式id组件

因此,您应该定义一个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
}

答案 1 :(得分:1)

对于 JPA 1 ,您无法将实体用作ID。 从JPA 1 Spec(2.1.14)

  

主键(或字段或属性   一个复合主键)应该是   以下类型之一:任何Java   原始类型;任何原始包装器   类型; java.lang.String中;   java.util.Date; java.sql.Date。

如果您使用JPA 1,您有两种选择:

A. 您需要使用自动生成的ID字段创建Project2User2Role,并且必须将其指定为实体的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