休眠连接:@OneToMany、@JoinTable或@SecondaryTable



我是实体和表之间的休眠连接的新手。

我想拥有以下模型架构(数据库中的实体(:

User    Seminar    SeminarParticipation
-----   -------    --------------------
id      id         seminar_id
name    name       user_id
...     ...        role

我知道第三个带有实体的表是由@ManyToMany自动创建的,但它有一个额外的字段,所以我想有一个完整的实体来简化 Java 中的访问。

我还想检索SeminarUser实体的参与情况。

我的问题是如何以最简单的方式在 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;
    ...
}

但是这段代码尝试创建另一个表,我的目的只是在彼此之间匹配这些实体,如果在使用 SeminarDAOUserDAO 时更改SeminarUser中的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;

您需要使用其他方法来将持久类映射到架构。

UserSeminar类似于参考项目(没有@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;
}

最新更新