Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为3个表使用OneToMany关系创建ORMapping_Java_Hibernate_Orm_Jpa_Entity Relationship - Fatal编程技术网

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

Java 为3个表使用OneToMany关系创建ORMapping,java,hibernate,orm,jpa,entity-relationship,Java,Hibernate,Orm,Jpa,Entity Relationship,我有3个表:项目、用户和角色。现在我想要一个表Project2User2Role,带有嵌入的键id\u project,id\u user 我尝试在所有三个实体中使用@OneToMany关系,但我认为我不能这样构建它 我还试着自己构建一个Project2User2Role实体类,但是我必须创建一个没有@ManyToOne关系的idclass 解决方案看起来如何?说明可以在嵌入的ID中嵌入关系: 虽然JPA中不支持,但Hibernate 允许您放置您的关联 直接在嵌入式id组件中 因此,您应该使用

我有3个表:项目、用户和角色。现在我想要一个表Project2User2Role,带有嵌入的键id\u project,id\u user

我尝试在所有三个实体中使用@OneToMany关系,但我认为我不能这样构建它

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

解决方案看起来如何?

说明可以在嵌入的ID中嵌入关系:

虽然JPA中不支持,但Hibernate 允许您放置您的关联 直接在嵌入式id组件中

因此,您应该使用类型为Project2User2RoleId的ID定义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
}

对于JPA 1,您不能将实体用作Id。 来自JPA 1规范(2.1.14)

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

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

A.您需要使用自动生成的id字段创建Project2User2Role,并且必须将其指定为实体的id。然后,您可以将关系添加到项目、用户和角色,并指定它们对应的注释映射(ManyToOne)。 例如:

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: Hibernate文档的第2.2.3节:

谢谢!我用了你的解决方案。使用双向映射(用户实体:@OneToMany(mappedBy=“user”)private List Project2User2Role;),我现在得到以下异常:Create:org.hibernate.AnnotationException:mappedBy引用未知的目标实体属性:…Project2User2Role.user in…Project2User2Role未测试,但请尝试mappedBy=“id.user”。如果语法与HQL/JPQL中用于属性的语法相似,那么它应该可以工作
@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;

    }