休眠一个到多个单向

时间:2013-05-06 22:49:00

标签: java hibernate maven hbm2ddl

我正在尝试制作一些hibernate的东西,并根据hibernate注释自动创建sql脚本。这就是我所拥有的:

日程安排课程:

@Entity
@Table(name = ScheduleTableConsts.TABLE_NAME)
public class Schedule implements Serializable {

@Id
@Column(name = ScheduleTableConsts.ID_COLUMN)
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = ScheduleSlotTableConsts.ID_COLUMN)
private List<ScheduleSlot> scheduleSlots;

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = LessonTableConsts.ID_COLUMN)
private List<Lesson> lessons;  

Constructors, getters, setters...

ScheduleSlot类:

@Entity
@Table(name = ScheduleSlotTableConsts.TABLE_NAME,
       uniqueConstraints = {@UniqueConstraint(columnNames = {TimeSlotTableConsts.ID_COLUMN,
                                                             PlaceSlotTableConsts.ID_COLUMN})})
public class ScheduleSlot implements Serializable {
@Id
@Column(name = ScheduleSlotTableConsts.ID_COLUMN)
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@OneToOne
@JoinColumn(name = TimeSlotTableConsts.ID_COLUMN)
private TimeSlot timeSlot;

@OneToOne
@JoinColumn(name = PlaceSlotTableConsts.ID_COLUMN)
private PlaceSlot placeSlot;  

Constructors, getters, setters...  

课堂课程:

@Entity
@Table(name = LessonTableConsts.TABLE_NAME)
public class Lesson implements Serializable {

@Id
@Column(name = LessonTableConsts.ID_COLUMN)
@GeneratedValue(strategy = GenerationType.AUTO)
private int            id;

@OneToMany(fetch = FetchType.LAZY)
private Set<Professor> professors;

@OneToMany(fetch = FetchType.LAZY)
private Set<Course>    courses;

@OneToMany(fetch = FetchType.LAZY)
private Set<Group>     groups;

@Column(name = LessonTableConsts.LAB_COLUMN)
private boolean        lab;  

Constructors, getters, setters...

我想要实现的是让时间表知道它的插槽和课程,而不是让插槽和课程知道它们属于的时间表。上面的代码似乎没问题,但是当我尝试生成sql脚本(为此目的使用maven和hibernate3-maven-plugin)并运行它时会发生以下情况:

  1. 它创建了一个SCHEDULE表,没有指向SCHEDULESLOT或LESSON表的指针;
  2. 它创建了SCHEDULESLOT和LESSON表,没有指向SCHEDULE表的指针。
  3. 有人可以告诉我,我做错了吗?

    提前感谢!

1 个答案:

答案 0 :(得分:8)

有一件事你忘了注意:

使用@OneToMany注释时,您不能简单地使用@JoinColumn。但是,另一方面,我的意思是@ManyToOne:您可以使用@JoinColumn

你应该清楚为什么这样做是这样的,而不是相反。 (实体如何在一列中保留这么多ID?)

所以你有两个选择:
1)使用特定表格存储OneMany实体之间的关系。像这样:

@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name = "SCHEDULE_SLOTS_MAPPING", joinColumns = @JoinColumn(name = "SCHEDULE_ID"), inverseJoinColumns = @JoinColumn(name = "SCHEDULE_SLOT_ID"))
private List<ScheduleSlot> scheduleSlots;

2)使用关系@JoinColumn方面的Many :(例如您的ScheduleSlot班级)

@ManyToOne
@JoinColumn(name="SCHEDULE_ID")
private Schedule schedule;