Due entità @ManyToOne dovrebbero unirsi allo stesso tavolo
-
26-09-2019 - |
Domanda
Ho le seguenti entità
studenti
@Entity
public class Student implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
//getter and setter for id
}
Maestro
@Entity
public class Teacher implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
//getter and setter for id
}
attività
@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
}
Si consideri che author
e curator
sono già memorizzati nel DB ed entrambi sono in stato allegato. Sto cercando di persistere mia Task
:
Task task = new Task();
task.setAuthor(author);
task.setCurator(curator);
entityManager.persist(task);
Sospensione esegue il seguente SQL:
insert
into
student_task
(teacher_id, id)
values
(?, ?)
che, naturalmente, porta a null value in column "student_id" violates not-null constraint
Qualcuno può spiegare questo problema e modi possibili per risolvere il problema?
Aggiorna
Vedere la mia soluzione qui di seguito.
Soluzione 2
Ho risolto il mio problema con l'aiuto di @SecondaryTable
e passato da @JoinTable
a @JoinColumn
:
attività
@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
}
Ora, sembra SQL generate come:
insert
into
student_task
(student_id, teacher_id, id)
values
(?, ?, ?)
e tutto funziona bene:)
Altri suggerimenti
Credo che vi manca il tag JoinColumns ...
joinColumns = { @JoinColumn(name = "student_id", referencedColumnName = "id") }
joinColumns = { @JoinColumn(name = "teacher_id", referencedColumnName = "id") }
rispettivamente autore e curatore
Anche ricordare, che l'inversjoincolumn è la colonna della tabella di proprietà .. quindi deve essere qualcosa di simile:
inverseJoinColumns = {@JoinColumn(name="id")})