2017-05-16 40 views
0

次のエンティティにOneToOne関係を設定しようとしています。イベント&計画。問題は、イベントのプランニングテーブルに何も入っていない(プラン作成のために)プランのテーブルに何も入っていないということです(更新版)Hibernate - OneToOneエラー

IDEで、私はブラウザから戻ってくるものを調べることができます。計画が新しいため、.idがnullです。

consoleには、event_idがNULLであるというエラーが表示されます(event_idはプラン・テーブルのFKです)。

イベント

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

計画

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

私は、既存のイベントを更新し、計画を作成する必要があるフォームを持っています。

私は、次のエラーがスローされるフォームを送信する場合:

ブラウザ:

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 

コンソール

私はこのエラーの根拠があることであることを理解し
""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) 

event_id(これはテーブルプランにあります)はnullにはできませんが、プランはpとして送信されますイベントアップデートのアート - 正しく設定された関係の結果としてevent_idが得られるでしょうか?ここ

イベントサービス

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

いただきましたの?

+0

データアクセスコードが表示されていないと、この問題が発生した理由を知ることはできません。 –

+0

オーナー側はmappedBy属性を持たない側です。これは、Hibernateが気にするものです。あなたは計画のイベントを設定することを確認する必要があります:計画。setEvent(...)。 –

+0

ブラウザから戻ってくるオブジェクトはイベントであり、いくつかのテストデータとともに、すでにプランオブジェクトがアタッチされています。なぜ私は再びその関係を設定する必要がありますか? –

答えて

0

これは双方向の関係ですので、基本的に必要なのは、リレーションの両側を参照することです。このあなたは答えはイベントテーブルに記録plan_idを持っていた1つの側からのマッピングを除去することにより、単方向であることを関係を回すか、不足している参照

0

を注入することができますいずれかを解決するために

。だから、注釈になった:

イベント

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

計画

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

私は実際にそれが双方向(上記の溶液は単方向である)を作るために必要なことはありません。

関連する問題