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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top