我有3个表:项目,用户和角色。现在我想要一个带有嵌入式密钥id_project,id_user,。的表Project2User2Role。
我在所有三个实体中使用@OneToMany关系尝试了它,但我想我不能像那样构建它。
我还试图自己构建一个Project2User2Role实体类,但是我必须创建一个没有@ManyToOne关系的idclass。
解决方案怎么样?
答案 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