2010-12-21 12 views
7

Ich habe zwei Entitäten:Hibernate Einsatz Kaskade nicht fremd Einfügen Schlüssel

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

Ich versuche, in die Datei eingefügt werden soll (und Tag später), indem Sie folgendermaßen vorgehen:

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

ich dann bin Einfügen die Datei in meinem DAO:

sessionFactory.getCurrentSession().saveOrUpdate(file); 

in meinen Logs ich einen Einsatz in meine „Datei“ Tisch und 2 Einsätze in meinen Tag zu sehen Tabelle jedoch ist der Fremdschlüssel in meiner Tag-Tabelle, die auf meine Dateitabelle (Datei-ID) verweist, NULL.

Was könnte ich möglicherweise falsch machen?

Antwort

13

Sie legen die Datei für ein Tag nicht fest, nur die Tags in eine Datei. Denken Sie daran, dass Sie in OOP im Gegensatz zum relationalen Modell beide Enden einer Beziehung festlegen müssen. Sie können nicht von Tag zu Datei navigieren, nur weil Sie einen Satz Tags zu einer Datei hinzugefügt haben. In Ihrem Fall können Sie einfach von File zu Tag navigieren (zB: alle Tags für eine Datei auflisten). Sie können nicht feststellen, zu welcher Datei ein Tag gehört, indem Sie nur auf den Tag schauen.

Was ist in der Regel ist eine Hilfsmethode erfolgt in einem der Modelle, wie folgt aus:

public void addTag(Tag tag) { 
    this.tags.add(tag); 
    tag.setFile(this); 
} 

Siehe this für ein Beispiel (aus dem Ruhezustand des Testsuite):

+1

Danke, arbeitete diese. Ich dachte wirklich aus irgendeinem Grund, dass Hibernate die Annahme für mich machen würde, dass ich wollte, dass Tag mit meinen Dateien aktualisiert wird, da ich die Beziehung auf beiden Seiten kommentiert hatte. –

+0

Der Link existiert nicht mehr :(Sie können eine andere Quelle angeben? – Filipe

+0

Ich habe die Antwort geändert, um auf die aktuellste Version zu zeigen. – jpkrohling

3

Fremdschlüssel in der Datenbank spiegelt den Status Tag.file wider (da Tag die besitzende Seite der Beziehung als eine "viele" Seite in einer bidirektionalen Viele-zu-eins-Beziehung ist).

Ich kann nicht sehen, wo Sie es einstellen.

Verwandte Themen