2016-03-20 11 views
0

Ich habe 2 Tabellen zugeordnet @ OneToMany und @ManyToOne und ihre Setter und Getter, so kann ein Benutzer mehrere Transaktionen haben und eine Transaktion könnte nur einen Benutzer haben.OneToMany und ManyToOne Beziehung

Wenn ich eine Transaktion in der Liste des Benutzers hinzufügen, gehen die Daten korrekt in die Tabelle und die Transaktion kann mit dem Getter des Benutzers abgerufen werden. Aber wenn ich Getter von der Transaktion verwende, um seinen Besitzer zu finden, findet er seine Benutzer-Benutzer-Tabelle nicht.

umge ist auch verfügbar, wenn ich ein Benutzer für eine Transaktion Datensatzes in der Datenbank beibehalten wird und Benutzer kann mit der Transaktion des Getter abgerufen werden, aber die Verwendung von Getter des Nutzers zeigt keine Transaktion ..

Die Die einzige Möglichkeit besteht darin, eine Transaktion in die Benutzerliste aufzunehmen und den Benutzer für die Transaktion festzulegen. Warum passiert dies? Ich dachte, wenn ich nur eine dieser Aktionen benutze, sollte die Umkehrung automatisch verfügbar sein.

Benutzer

@Entity 
@Table(name = "users") 
public class User{ 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int id; 
@OneToMany(mappedBy = "user") 
private Collection<Transaction> transactions; 

Transaktion

@Entity 
@Table(name="user_transactions") 
public class Transaction{ 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int id; 
@ManyToOne 
@JoinColumn(name = "user_id") 
private User user; 

ich keinen Unterschied in den Tabellen sehen können, jede Aktion, die ich tun beide Tabellen die gleiche Struktur haben. Wie weiß JPA, wie ich die Objekte gespeichert und wieder aufgebaut habe ...?

+0

Es geschieht, weil das ist, wie JPA angegeben ist. Es verwendet POJOs, und wenn Sie ein Feld auf null belassen, ist das Feld null. Wenn Sie einer Liste keine Transaktion hinzufügen, enthält die Liste die Transaktion nicht. Es liegt an Ihnen, die Kohärenz Ihrer Objekte zu erhalten. JPA wird Ihnen jedoch kohärente Objekte zurückgeben, wenn Sie sie aus der Datenbank lesen. –

+0

Aber gibt es noch einen anderen Weg, um das so zu machen, wie ich es will? – Mike

+0

Nein. Wenn Sie einem Benutzer eine Transaktion hinzufügen und den Benutzer der Transaktion festlegen möchten, müssen Sie ihn codieren. JPA wird das nicht für dich tun. –

Antwort

0

Soweit ich mich erinnere, gibt es keinen Standard CascadeType. Sie müssen mindestens eine angeben, zum Beispiel in Ihrem Fall:

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) 
private Collection<Transaction> transactions; 

Sie Kaskadentypen hier zu lesen: http://howtodoinjava.com/hibernate/hibernate-jpa-cascade-types/