我正在尝试制作一些休眠的东西,并基于休眠的注释自动创建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)并运行它时,会发生以下情况:
它创建一个SCHEDULE表,其中没有指向SCHEDULESLOT或LESSON表的指针。
它创建SCHEDULESLOT和LESSON表,而没有指向SCHEDULE表的指针。
有人可以告诉我我做错了吗?
预先感谢!
最佳答案
您会忘记一件事:
使用@OneToMany
注释时,不能简单地使用@JoinColumn
。但是,另一方面,我的意思是@ManyToOne
:您可以使用@JoinColumn
。
您应该清楚为什么会这样,而不是相反。 (实体如何仅在一列中保留这么多ID?)
因此,您在这里有两个选择:
1)使用特定的表存储您的One
和Many
实体之间的关系。像这样:
@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;