2010-12-21 10 views
7

Mam dwa podmioty:Hibernate wkładka kaskada nie wkładając klucz obcy

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

próbuję wstawić do pliku (a następnie Tag) w następujący sposób:

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

jestem następnie wkładając plik w moim DAO przy użyciu:

sessionFactory.getCurrentSession().saveOrUpdate(file); 

W moich logach widzę wkładkę do mojego "pliku" tabeli i 2 wstawki do mojego tagu tabela, jednak klucz obcy w mojej tabeli znaczników, który wskazuje na moją tabelę plików (file_id) ma wartość NULL.

Co mogłem robić źle?

Odpowiedz

13

Nie ustawiasz pliku dla znacznika, tylko znaczniki dla pliku. Pamiętaj, że w OOP, w przeciwieństwie do modelu relacyjnego, musisz ustawić oba końce relacji. Nie możesz nawigować z Tag do pliku tylko dlatego, że dodałeś zestaw tagów do pliku. W twoim przypadku możesz po prostu nawigować z pliku do znacznika (np. Listować wszystkie znaczniki pliku). Nie można stwierdzić, do którego pliku należy znacznik, patrząc tylko na znacznik.

Co jest zwykle wykonywane jest metodą pomocnik w jednym z modeli, takich jak to:

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

Zobacz this na przykład (z testu pakietu Hibernate):

+1

Dzięki, to działało. Naprawdę, z jakiegoś powodu, myślałem, że Hibernate podejmie dla mnie założenie, że chciałem, aby to Tag był aktualizowany z moimi plikami, ponieważ miałem relację opisaną po obu stronach. –

+0

Link nie istnieje więcej :(możesz podać inne źródło? – Filipe

+0

Zmieniłem odpowiedź, aby wskazywała na najbardziej aktualną wersję. – jpkrohling

3

Klucz obcy w bazie danych odzwierciedla stan Tag.file (od Tag jest stroną będącą właścicielem po stronie "wiele" w dwukierunkowej relacji "wiele do jednego").

Nie widzę, gdzie ją ustawić.