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

}

authorcuratorはすでにDBに保存されており、両方とも接続状態になっていることを考慮してください。私は自分の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 に答える