2016-08-17 99 views
0

我想用OneTOMany选项创建2个实体类。以下是我的表格结构。OneToMany或ManyToMany在休眠映射

|    |  |     | 
| EVENTS |  | PARTICIPANT | 
|_____________|  |__________________| 
|    |  |     | 
| *EVENT_ID | --> | *EVENT_ID  | 
| EVENT_DATE |  | *EMAIL   | 
| TITLE  |  | PARTICIPANT_NAME| 
|_____________|  |__________________| 

事件ID将自动生成,与事件相关的参与者应与事件详细信息一起保存。以下是我的实体类。

@Entity 
@Table(name = "EVENTS") 
public class Event{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name = "event_id") 
    private Integer eventId; 

    @column(name = "event_date") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date eventDate; 
    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "event_id") 
    private List<Participant> participantList; 
    //getters and setters 
} 

@Entity 
@Table(name = "PARTICIPANT") 
public class Participant{ 
    @Id 
    @Column(name = "event_id") 
    private Integer eventId; 

    @Id 
    @column(name = "email") 
    private String email; 

    @Column(name = "participant_name") 
    private String participantName; 
    //getters and setters 
} 

在创建新事件时,我设置了参与者列表并尝试保存。如果我通过更改日期来修改保存的事件并删除一些参与者并添加新的参与者,我想更新参与者表,而无需额外的努力保存呼叫。哪一个将是使用的正确注释。我正在使用Hibernate 4.3.10版本。 注意我不想创建新的映射表,因为我没有整个参与者列表。提前致谢。

回答

0

如果我通过更改日期修改已保存的事件,并删除一些 参与者,并添加新的参与者我想,没有任何额外的努力将通话更新 参与者表。

你应该选择必要的级联型和孤儿删除选项在Event类(是否要删除操作应用到已经从关系中去除实体和级联删除操作这些实体):

@OneToMany(fetch = FetchType.EAGER, mappedBy = "event", cascade = {CascadeType.ALL}, orphanRemoval = true) 
private List<Participant> participantList; 

另外,我建议有单独的主键(id)为Participant

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name = "id") 
private Integer id; 

如果您决定实施您的与OneToMany解决方案 - ManyToOne关系添加到Participant

@ManyToOne 
@JoinColumn(name="event_id") 
Event event; 

上述解决方案已经缺点 - 一个参与者可以只用一个事件相关。如果同一参与者可以参加多于一个事件,则应该使用@ManyToMany关系。