JPA和关系映射的新手问题

时间:2012-10-24 13:41:27

标签: java jpa

我正在尝试使用以下类型的映射

Table event has the following columns:
id (PK)
prodgroup
errandtype

table errandtype : errandtype

table prodgroup: prodgroup

我有相应的JPA课程

@Entity
@Table(name="event")
public class MyEvent {
    @Id
    int id;

    // what mapping should go here?
    Prodgroup prodgroup;

    // what mapping should go here?
    ErrandType errandtype;
} 

@Entity
public class Prodgroup {
    @Id
    private String prodgroup;
}

@Entity
public class ErrandType {
    @Id
    private String errandtype;
}

好的,所以问题在代码中被标记为注释,但无论如何我都会尝试显式。

在上面的例子中,我想将MyEvent类中的Prodgroup和ErrandType字段设置为相应的Prodgroup和Errandtype实例

我已经尝试了与@joincolumns和mappedby属性的@OneToOne关系,但我无法让它工作,我已经失去了所有的逻辑方法感。我对JPA实体映射的掌握显然很弱。

那么有人能说清楚吗?

2 个答案:

答案 0 :(得分:3)

应该是:

@Entity
@Table(name="event")
public class MyEvent {
    @Id
    int id;

    // what mapping should go here?
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "prodgroup_id", insertable = true, updatable = true)
    Prodgroup prodgroup;

    // what mapping should go here?
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "errandtype_id", insertable = true, updatable = true)
    ErrandType errandtype;
} 

@Entity
public class Prodgroup {
    @Id
    private String prodgroup;
}

@Entity
public class ErrandType {
    @Id
    private String errandtype;
}

FetchType Eager表示将始终加载对象(如果未指定,则默认为“Lazy”)。
CascadeType.ALL表示也会对链接表进行mearge / persist / remove。

塞巴斯蒂安

答案 1 :(得分:1)

您的表列event.prodgroupevent.errandtype是各个表的外键(prodgroup,errandtype)。因此,您需要@ManyToOne关联(因为许多事件可能共享一个prodgroup或错误类型)。