Nicht machen, @ManyToOne Beziehung null-Werte zulässt
Habe ich eine viele-zu-eins-Beziehung zu sein möchte ich nullable:
@ManyToOne(optional = true)
@JoinColumn(name = "customer_id", nullable = true)
private Customer customer;
Leider, JPA hält die Einstellung der Spalte in meiner Datenbank als not NULL. Kann das jemand erklären? Gibt es eine Möglichkeit, damit es funktioniert? Beachten Sie, dass ich benutze JBoss 7, JPA 2.0 mit Hibernate als Persistenz-provider und eine PostgreSQL-9.1 Datenbank.
BEARBEITEN:
Fand ich die Ursache meines Problems. Scheinbar ist es aufgrund der Art, wie ich Sie definiert den Primärschlüssel in der referenzierten Entität Customer
:
@Entity
@Table
public class Customer {
@Id
@GeneratedValue
@Column(columnDefinition="serial")
private int id;
}
Scheint es, dass mit @Column(columnDefinition="serial")
für den Primärschlüssel setzt automatisch der Fremdschlüssel, die sich auf es zu NOT NULL
in der Datenbank. Ist das wirklich das erwartete Verhalten bei der Angabe der Spalte Typ als serial
? Gibt es eine Abhilfe für die Aktivierung der null-Werte zulässt Fremdschlüssel in diesem Fall?
Vielen Dank im Voraus.
InformationsquelleAutor der Frage vcattin | 2013-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich die Lösung zu meinem problem. Die Art und Weise der Primärschlüssel definiert ist, in Einheit
Customer
ist in Ordnung, das problem liegt in der foreign-key-Erklärung. Es sollte erklärt werden wie diese:In der Tat, wenn das Attribut
columnDefinition="integer"
weggelassen wird, foreign key wird standardmäßig festgelegt werden, wie die Quell-Spalte: eine nicht-null-Serie mit seiner eigenen Reihenfolge. Das ist natürlich nicht das, was wir möchten, wir wollen nur, dass der Verweis auf die auto-increment-ID, nicht um eine neue zu erstellen.Außerdem scheint es, dass das Attribut
name=customer_id
ist auch erforderlich, da ich beobachtete, dass bei der Durchführung einige Tests. Ansonsten ist der foreign key-Spalte wird noch festgelegt werden, wie die Spalte Quelle. Das ist ein komisches Verhalten meiner Meinung nach. Kommentare oder zusätzliche Informationen zu klären sind herzlich willkommen!Schließlich der Vorteil dieser Lösung ist, dass die ID wird von der Datenbank erzeugt (nicht durch JPA) und so haben wir keine Angst zu haben, beim einfügen von Daten manuell oder mithilfe von Skripts, die oft in der migration von Daten oder die Wartung.
InformationsquelleAutor der Antwort vcattin
Stieß ich auf dieses problem, aber ich war in der Lage, es zu lösen, auf diese Weise:
Vielleicht ist das problem entstand aus der Deklaration
@ManyToOne(optional = true)
InformationsquelleAutor der Antwort oschlueter
Dass ist sehr seltsam.
In JPA nullable-parameter ist standardmäßig true. Ich benutze diese Art der Konfiguration die ganze Zeit und es funktioniert gut. Wenn Sie versuchen, zu speichern Entität, die es erfolgreich sein sollte.
Haben Sie versucht, löschen Sie die Tabelle, die erstellt wird, für diese Beziehung? Vielleicht haben Sie legacy-Tabelle mit dieser Spalte?
Oder vielleicht sollten Sie versuchen, Lösungen zu finden, die auf anderen Stücken code, denn dies ist die richtige Konfiguration.
Hinweis: ich habe versucht diese Konfiguration auf PostgreSQL mit JPA2 und Hibernate.
BEARBEITEN
In diesem Fall können Sie vielleicht versuchen, eine etwas andere definition von Primärschlüssel.
Zum Beispiel können Sie verwenden-definition:
und postgresql generiert
Wenn diese gut genug ist, können Sie versuchen, diese Lösung.
InformationsquelleAutor der Antwort pedjaradenkovic