Java 带有@ManyToOne的两个实体应连接到同一个表中

Java 带有@ManyToOne的两个实体应连接到同一个表中,java,hibernate,jpa,many-to-one,Java,Hibernate,Jpa,Many To One,我有以下实体 学生 @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 @Generat

我有以下实体

学生

@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

}
@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

}
假设
作者
馆长
已经存储在数据库中,并且都处于附加状态。我正在尝试持久化我的
任务

Task task = new Task();
task.setAuthor(author);
task.setCurator(curator);
entityManager.persist(task);
Hibernate执行以下SQL:

insert 
  into
    student_task
    (teacher_id, id) 
  values
    (?, ?)
当然,这会导致“student_id”列中的
null值违反not null约束

有人能解释这个问题和可能的解决方法吗

更新


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

我认为您缺少JoinColumns标记

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

joinColumns = { @JoinColumn(name = "teacher_id", referencedColumnName = "id") }
作者和策展人分别

还要记住,InverseJoinColumn是owned表中的列。。所以它一定是这样的:

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

我想你错过了JoinColumns标签

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

joinColumns = { @JoinColumn(name = "teacher_id", referencedColumnName = "id") }
作者和策展人分别

还要记住,InverseJoinColumn是owned表中的列。。所以它一定是这样的:

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

我在
@SecondaryTable
的帮助下解决了问题,并从
@JoinTable
切换到
@jointcolumn

任务

@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

}
@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
    (?, ?, ?)

一切正常:)

我在
@SecondaryTable
的帮助下解决了我的问题,并从
@JoinTable
切换到
@jointcolumn

任务

@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

}
@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
    (?, ?, ?)

而且一切正常:)

对不起,这对我的案子不起作用。但是,我已经使用@SecondaryTable解决了这个问题。很抱歉,这对我的案例不起作用。但是,我已经使用@SecondaryTable解决了这个问题。