我有3个表:Project,User和Role。现在我想要一个具有嵌入式密钥id_project,id_user的表格Project2User2Role。使用一对多关系为3个表创建ORMapping
我在所有三个实体中都使用了@OneToMany关系,但我认为我不能像这样构建它。
而且我也尝试通过我自己构建一个Project2User2Role实体类,但是我必须创建一个没有@ManyToOne关系的idclass。
该解决方案的外观如何?
我有3个表:Project,User和Role。现在我想要一个具有嵌入式密钥id_project,id_user的表格Project2User2Role。使用一对多关系为3个表创建ORMapping
我在所有三个实体中都使用了@OneToMany关系,但我认为我不能像这样构建它。
而且我也尝试通过我自己构建一个Project2User2Role实体类,但是我必须创建一个没有@ManyToOne关系的idclass。
该解决方案的外观如何?
的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
}
对于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
谢谢!我用你的解决方案。使用双向映射(用户实体:@OneToMany(mappedBy =“user”) private List Project2User2Role;),现在我得到以下异常:Create:org.hibernate.AnnotationException:mappedBy引用未知的目标实体属性: ... Project2User2Role.user in ... project2User2Role –
nogamawa
2011-02-28 14:58:52
未经测试,但尝试mappedBy =“id.user”。如果语法与用于HQL/JPQL中的属性的语法类似,它应该起作用 – 2011-02-28 16:12:12