Спящий от одного до многих одного направления
Я пытаюсь сделать что-нибудь спящий и автоматически создавать сценарии 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.
Может кто-нибудь сказать, пожалуйста, что я делаю не так?
Заранее спасибо!
1 ответ
Есть вещь, которую вы забыли заметить:
Когда используешь @OneToMany
аннотации, вы не можете просто использовать @JoinColumn
, Тем не менее, с другой стороны, я имею в виду @ManyToOne
: ты можешь использовать @JoinColumn
,
Вам должно быть понятно, почему это работает именно так, а не наоборот. (Как объект может хранить столько идентификаторов в одном столбце?)
Итак, у вас есть два варианта здесь:
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;