2017-05-16 4 views
0

Ich versuche, eine OneToOne Beziehung auf den folgenden Entitäten einzurichten Ereignis & Plan. Das Problem ist, dass, wenn ich (das ist ein Update) auf Ereignis geht nichts geht in die Plan-Tabelle (für Plan erstellen)Hibernate - OneToOne Fehler

In der IDE kann ich überprüfen, was aus dem Browser zurückkommt und es gibt einen Wert in Plan - obwohl planen .id ist null, da der Plan neu ist.

Die Konsole zeigt einen Fehler an, dass event_id null ist (event_id ist die FK in der Plantabelle).

Ereignis

@Entity 
public class Event { 
@Id 
private Long id; 
@OneToOne(mappedBy = "event", cascade = CascadeType.PERSIST) 
private Plan plan; 
// 

-Plan

@Entity 
public class Plan { 
@Id 
private Long id; 
@OneToOne 
@JoinColumn(name = "event_id", nullable = false) 
private Event event 
// 

ich eine Form haben, die ein vorhandenes Ereignis aktualisiert und braucht einen Plan zu erstellen.

Als ich senden Sie das Formular der folgende Fehler ausgelöst wird:

Browser:

There was an unexpected error (type=Internal Server Error, status=500). 
could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement 

Konsole

""2017-05-16 19:16:34 - Column 'event_id' cannot be null 
""2017-05-16 19:16:34 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause 
"com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'event_id' cannot be null 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 

Ich verstehe, dass die Grundlage dieses Fehlers ist, dass event_id (das im Tabellenplan steht) darf nicht null sein - aber der Plan wird als p übergeben Art eines Ereignisupdates - also sollte event_id als Ergebnis einer korrekt eingerichteten Beziehung erhalten werden?

Event Service

Event savedEvent = eventRepository.save(event); // this line ok 
return eventRepository.save(event); // this line errors as above 

Was stimmt hier nicht?

+0

Ohne den Datenzugriffscode zu sehen, ist es unmöglich zu sagen, warum Sie dieses Problem haben. –

+0

Die Eigentümerseite ist die Seite, die das Attribut mappedBy nicht aufweist. Es ist der, um den sich Hibernate kümmert. Sie müssen sicherstellen, dass das Ereignis des Plans festgelegt wird: planen.setEvent (...). –

+0

Das Objekt, das vom Browser zurückkommt, ist ein Ereignis und es ist bereits ein Planobjekt mit einigen Testdaten angefügt. Warum muss ich diese Beziehung erneut festlegen? –

Antwort

0

Dies ist eine bidirektionale Beziehung, also benötigen Sie im Grunde jede Seite der Beziehung, um auf die andere Seite zu verweisen, in Ihrem Fall haben Sie nur eine Referenz.

Um dies zu lösen, können Sie entweder die Beziehung drehen unidirektional zu sein, indem die Zuordnung von einer Seite zu entfernen oder die fehlende Referenz

0

Die Antwort injizieren war die plan_id auf der Ereignistabelle festgehalten wird. So sind die Anmerkungen wurde:

Ereignis

@Entity 
public class Event { 
@Id 
private Long id; 
@OneToOne(cascade = CascadeType.ALL) 
private Plan plan; 
// 

-Plan

@Entity 
public class Plan { 
@Id 
private Long id; 
// 

ich nie wirklich gebraucht, um es Bidirektionale zu machen (die Lösung oben ist unidirektional).

Verwandte Themen