Две сущности с @ManyToOne должны присоединиться к одной таблице - PullRequest
1 голос
/ 12 июня 2010

У меня есть следующие объекты

Student

@Entity
public class Student implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  //getter and setter for id

}

Учитель

@Entity
public class Teacher implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  //getter and setter for id

}

Задача

@Entity
public class Task implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @ManyToOne(optional = false)
  @JoinTable(name = "student_task", inverseJoinColumns = { @JoinColumn(name = "student_id") })
  private Student author;

  @ManyToOne(optional = false)
  @JoinTable(name = "student_task", inverseJoinColumns = { @JoinColumn(name = "teacher_id") })
  private Teacher curator;

  //getters and setters

}

Учтите, что author и curator уже сохранены в БД и оба находятся в подключенном состоянии. Я пытаюсь упорствовать Task:

Task task = new Task();
task.setAuthor(author);
task.setCurator(curator);
entityManager.persist(task);

Hibernate выполняет следующий SQL:

insert 
  into
    student_task
    (teacher_id, id) 
  values
    (?, ?)

, что, конечно, приводит к null value in column "student_id" violates not-null constraint

Может кто-нибудь объяснить эту проблему и возможные пути ее решения?

UPDATE

См. Мое собственное решение ниже.

Ответы [ 2 ]

2 голосов
/ 13 июня 2010

Я решил свою проблему с помощью @SecondaryTable и переключился с @JoinTable на @JoinColumn:

Задание

@Entity
@SecondaryTable(name="student_task")
public class Task implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @ManyToOne(optional = false)
  @JoinColumn(table = "student_task", name = "student_id")
  private Student author;

  @ManyToOne(optional = false)
  @JoinColumn(table = "student_task", name = "teacher_id")
  private Teacher curator;

  //getters and setters

}

Сейчассгенерированный SQL выглядит так:

insert 
  into
    student_task
    (student_id, teacher_id, id) 
  values
    (?, ?, ?)

и все работает просто отлично:)

2 голосов
/ 12 июня 2010

Я думаю, что вам не хватает тега JoinColumns ...

joinColumns = { @JoinColumn(name = "student_id", referencedColumnName = "id") }

joinColumns = { @JoinColumn(name = "teacher_id", referencedColumnName = "id") }

у автора и куратора соответственно

Также помните, что inversjoincolumn - это столбец в собственной таблице ... поэтому он должен выглядеть примерно так:

inverseJoinColumns = {@JoinColumn(name="id")})
...