Спящий от одного до многих одного направления

Я пытаюсь сделать что-нибудь спящий и автоматически создавать сценарии 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.

Может кто-нибудь сказать, пожалуйста, что я делаю не так?

Заранее спасибо!

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;
Другие вопросы по тегам