2016-07-03 13 views
0

Ich befürchte, dass dies schon einmal gefragt wurde, aber ich finde oder nicht verstehen die Antwort auf ähnliche Fragen.JPA OneToOne Relation automatische Erstellung

Ich habe diese eine Tabelle offerte

@Entity 
public class Offerte extends BaseEntity{ 

    @OneToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="dossier") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @NotNull 
    private Dossier dossier; 

dass einen OneToOne Anschluss an den Tisch Dossier hat und bei der Erstellung einer offerte ich es möge ein Dossier erstellt automatisch werden.

@Entity 
public class Dossier extends BaseEntity{ 

    @OneToOne(fetch=FetchType.LAZY, mappedBy="dossier") 
    @NotNull 
    private Offerte offerte; 

Ich habe versucht, dies mit dem Generation Auto zu tun, aber ich halte die Verletzung Gettin

List of constraint violations:[ 
ConstraintViolationImpl{interpolatedMessage='may not be null', 

Ist es möglich, diese Beziehung automatisch gültig zu machen?

EDIT

des Flusses vorgeschlagen java Lösung

@Entity 
public class Offerte extends BaseEntity{ 
    @OneToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name="dossier") 
    @NotNull 
    private Dossier dossier = new Dossier(); 

gibt die folgenden Fehler

javax.validation.ConstraintViolationException: Validation failed for classes [be.ugent.lca.data.entities.Dossier] during persist time for groups [javax.validation.groups.Default, ] 
List of constraint violations:[ 
ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=offerte, rootBeanClass=class be.ugent.lca.data.entities.Dossier, messageTemplate='{javax.validation.constraints.NotNull.message}'} 
] 
+0

Könnten Sie bitte beschreiben laden verwandte Tabellen mit Spaltennamen? –

+0

Wie meinst du genau, die @Column (name = "dossier, ... annotation? Ursache, die nicht mit einer @ OneToOne-Beziehung erlaubt war. Auch die 2 Spaltennamen für diese Beziehung sind nur Dossier und offerte – turoni

+0

GeneratedValue ist illegal auf einem Beziehungsfeld ... es ist für Long, Integer, String etc –

Antwort

0

Um offerte geschaffen zu haben, wenn Sie neues Objekt Dossier erstellen - Sie sollten nur fallen runter zu Java Lösung:

public class Dosier { 
    @OneToOne(cascade = CascadeType.ALL) 
    @NotNull 
    private Offerte offerte = new Offerte(....); 
} 

Dies wird folgende Auswirkungen hat:

  • Immer wenn neues Dosier-Objekt (durch den Aufruf Konstruktor) offerte Variable erstellt wird, wird als Teil der Konstruktion mit neuer Offerte Objekt bestückt werden.
  • Wenn Sie Dosier wie geschaffen speichern, dass es OFFERTE Objekt sparen (das ist, was Kaskade Option für ist)
  • Wenn Sie erstellt Dossier laden - JPA wird OFFERTE Objekt und initialisieren Dossier korrekt
+0

Ich möchte die Umkehrung machen und den Fehler erhalten, dass dies vor dem Speichern des Objekts durchgeführt werden muss: org.hibernate.TransientPropertyValueException: Not-Null-Eigenschaft verweist auf einen transienten Wert - transiente Instanz muss vor der aktuellen Operation gespeichert werden: be.ugent. lca.data.entities.Offerte.dossier -> be.ugent.lca.data.entities.Dossier – turoni

+0

Vergewissern Sie sich, dass Sie (office = CascadeType.ALL) zum Offerte # -Dossierfeld hinzugefügt haben. – river

+0

Schauen Sie sich auch diese [Antwort] (http://stackoverflow.com/a/10687818/6529383) an, um Ihnen bei der korrekten Zuordnung der Eins-zu-eins-Zuordnung zu helfen. – river

Verwandte Themen