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