Hibernate inserto a cascata non l'inserimento di chiave esterna
-
12-10-2019 - |
Domanda
Ho due entità:
@Entity
public class File
.......
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@OneToMany(fetch=FetchType.LAZY, mappedBy="file", cascade=CascadeType.ALL)
private List<Tag> tags;
.......
OTHER PROPERTIES
.......
@Entity
public class Tag
.......
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn(name="file_id")
private File file;
@Column
private String tag;
.......
OTHER PROPERTIES
.......
Sto cercando di inserire nel file (e successivamente Tag) facendo quanto segue:
File file = new File();
Tag tag = new Tag();
tag.setTag("tag1");
Tag2 tag2 = new Tag();
tag2.setTag("tag2");
List<Tag> tags = new ArrayList<Tag>();
tags.add(tag);
tags.add(tag2);
file.setTags(tags);
---Add other file attributes here---
Sto poi inserendo il file nel mio DAO utilizzando:
sessionFactory.getCurrentSession().saveOrUpdate(file);
Nel mio log vedo un inserimento nella mia tabella "file" e 2 inserti nella mia tabella delle variabili, tuttavia, la chiave esterna nella mia tabella di tag che punta al mio tavolo di file (file_id) è nullo.
Cosa potrei fare male?
Soluzione
Non sta impostando il file per un tag, solo i tag di un file. Ricordate che in OOP, in contrapposizione al modello relazionale, è necessario impostare entrambe le estremità di una relazione. Non si può navigare da tag per file solo perché si è aggiunto un set di tag a un file. Nel tuo caso, si può solo passare da file per Tag (vale a dire: elenca tutti i Tag per un file). Non si può dire che un tag del file appartiene, cercando solo al tag.
Ciò che di solito è fatto è un metodo di supporto in uno dei modelli, in questo modo:
public void addTag(Tag tag) {
this.tags.add(tag);
tag.setFile(this);
}
Vedere questo per un esempio (da suite di test di Hibernate):
Altri suggerimenti
La chiave esterna nel database riflette lo stato di Tag.file
(dal momento che è il lato Tag
possedere della relazione come un lato "molti" in un rapporto bidirezionale molti-a-uno).
Non riesco a vedere dove si imposta.