我是实体和表之间的休眠连接的新手。
我想拥有以下模型架构(数据库中的实体(:
User Seminar SeminarParticipation
----- ------- --------------------
id id seminar_id
name name user_id
... ... role
我知道第三个带有实体的表是由@ManyToMany自动创建的,但它有一个额外的字段,所以我想有一个完整的实体来简化 Java 中的访问。
我还想检索Seminar
和User
实体的参与情况。
我的问题是如何以最简单的方式在 Java 中映射这些实体,而无需将来在 DAO 中进行多次查询?
我尝试过这种方法:
Seminar
类(User
类似(:
@Entity
@Table(name = "seminars")
public class Seminar {
@Id
@GeneratedValue
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<SeminarParticipation> participations;
...
}
SeminarParticipation
类:
@Entity
@Table(name = "seminar_participations")
public class SeminarParticipation {
@Id
@GeneratedValue
private int id;
@ManyToOne
private Seminar seminar;
@ManyToOne
private User user;
@Column(nullable = false)
private int role;
...
}
但是这段代码尝试创建另一个表,我的目的只是在彼此之间匹配这些实体,如果在使用 SeminarDAO
或 UserDAO
时更改Seminar
或User
中的List<SeminarParticipation>
也会影响表中SeminarParticipation
实体,我们将不胜感激。
我也找到了@JoinTable和@SecondaryTable的解决方案,但我不确定它们可能会有所帮助......
我不确定您的问题是什么,但是@SecondaryTable
绝对不是您在这种情况下会使用的。
如果您在创建的映射中遇到问题,则很可能与您未指定"mappedBy"属性有关,该属性在双向关系的情况下是必需的。
http://docs.oracle.com/javaee/5/api/javax/persistence/OneToMany.html#mappedBy((
因此,用户和研讨会应在其@OneToMany
关联上指定 mappedBy 属性:
@OneToMany(mappedBy = "user" ....)
private List<SeminarParticipation> participations;
@OneToMany(mappedBy = "seminar" ....)
private List<SeminarParticipation> participations;
您需要使用其他方法来将持久类映射到架构。
User
和Seminar
类似于参考项目(没有@OneToMany
(。SeminarParticipation
和你已经拥有的一样。
@Entity
@Table(name = "seminars")
public class Seminar {
@Id
@GeneratedValue
private int id;
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private int id;
}
@Entity
@Table(name = "seminar_participations")
public class SeminarParticipation {
@Id
@GeneratedValue
private int id;
@ManyToOne
private Seminar seminar;
@ManyToOne
private User user;
@Column(nullable = false)
private int role;
}