1

我有以下实体

学生

@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

谁能解释这个问题以及解决它的可能方法?

更新

请参阅下面我自己的解决方案。

4

2 回答 2

3

我已经解决了我的问题,@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
    (?, ?, ?)

一切都很好:)

于 2010-06-12T23:13:41.917 回答
2

我认为您缺少 JoinColumns 标签...

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

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

分别在作者和策展人

还要记住,inversjoincolumn 是拥有表中的列。所以它必须是这样的:

inverseJoinColumns = {@JoinColumn(name="id")})
于 2010-06-12T19:00:20.997 回答