在Hibernate中OneToMany或ManyToMany Mappring

时间:2016-08-17 16:25:19

标签: java hibernate many-to-many one-to-many

我正在尝试使用OneTOMany选项创建2个实体类。下面是我的表格结构。

|             |      |                  |
|   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
}

在创建新的EVENT时,我正在设置参与者列表并尝试保存。如果我通过更改日期并删除一些参与者并添加新参与者来修改已保存的事件,我想更新参与者表而无需任何额外的努力保存调用。哪一个是正确使用的注释。我正在使用Hibernate 4.3.10版本。 注意我不想创建新的Mapping表,因为我没有整个Participants列表。在此先感谢。

1 个答案:

答案 0 :(得分:0)

  

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

您应该在setManualSessionHandling类中选择必要的级联类型和孤立删除选项(是否将删除操作应用于已从关系中删除的实体,并将删除操作级联到这些实体):

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; 关系。