OneToMany アノテーションを追加すると、EntityManager が JPA/Hibernate を使用してインスタンス化に失敗します
-
20-09-2019 - |
質問
を追加するときにEntityManagerをインスタンス化できないことに苦労しています。 OneToMany
すでにあるクラスへの列 OneToMany
カラム。
今のところ、 EducationInfo
があります OneToOne
各行はユーザーに固有であるため、ユーザー名を指定してすべての教育情報をロードできるようにしたいと考えています。
列を追加するときに orm.xml ファイルを変更するのではなく、データベースを再作成できるようにデータベースを削除するだけです。
class User {
@Id
@GeneratedValue(){val strategy = GenerationType.AUTO}
var id : Int = _
@Column{val nullable = false, val length=32}
var firstName : String = ""
var lastName : String = ""
@Column{val nullable = false, val unique = true, val length = 30}
var username : String = ""
@OneToMany{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.ALL)}
var address : java.util.List[Address] = new java.util.ArrayList[Address]()
@OneToMany{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.ALL), val mappedBy="user"}
var educationInfo : java.util.List[EducationInfo] = new java.util.ArrayList[EducationInfo]()
最後の列を含めないと単体テストは正常に動作しますが、これを含めるとすべての単体テストが失敗します。
これが使用しようとしているクラスであり、このクラスの単体テストは正常に動作します。
@Entity
@Table{val name="educationinfo"}
class EducationInfo {
@Id
@GeneratedValue(){val strategy = GenerationType.AUTO}
var id : Long = _
@Column{val nullable = false, val length = 100}
var name : String = "";
@OneToOne{val fetch = FetchType.EAGER, val cascade = Array(CascadeType.PERSIST, CascadeType.REMOVE)}
@JoinColumn{val name = "educationinfo_address_fk", val nullable = false}
var location : Address = _
@ManyToOne{val fetch = FetchType.LAZY, val cascade=Array(CascadeType.PERSIST)}
@JoinColumn{val name = "educationinfo_user_fk", val nullable = false}
var user : User = _
@Column{val nullable = false, val length = 100}
var degree : String = ""
@Temporal(TemporalType.DATE)
@Column{val nullable = true}
var startyear : Date = new Date()
var endyear : Date = new Date()
@Column{val nullable = true, val length = 1000}
var description : String = ""
}
EntityManager のインスタンス化を妨げるエラーが何であるかを知る方法があるかどうかも知りたいのですが、主な問題は、この列を User に追加するときに何が問題を引き起こす可能性があるかということです。
アップデート:
誤りがあった部分を削除しました。
更新 2:
教育エンティティのユーザー列を次のように変更しました。 @ManyToOne
そして私の単体テストはすべて失敗しました。
私のエラーログの最後は次のとおりです。
15035 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
15035 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled
15047 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
[PersistenceUnit: jpaweb] Unable to build EntityManagerFactory
[PersistenceUnit: jpaweb] Unable to build EntityManagerFactory
その後、EntityManager はすべてのテストで null になるため、失敗します。
更新 3:
の Address
エンティティは複数のエンティティから呼び出されるため、外部キーを持ちません。
この問題は、Apache Derby をデータベースとして使用することが原因で発生する可能性がありますか?
残念ながら、エラーメッセージは表示されません。これをMaven内から実行しますが、毎回データベースを削除しますが、何が起こっているのかわかりません。EducationInfo -> User の @ManyToOne は問題を引き起こしませんが、User の @OneToMany -> EducationInfo は問題を引き起こします。
更新 4:
提案に従って、User エンティティに mappedBy を追加しました。機能しない定義が 5 つあり、それらはすべて同じ理由によるものと思われるため、1 つだけでテストしています。残念ながら、それでも EntiyManagerFactory が構築されないため、すべてのテストが失敗します。
最終更新:
実際のケースは、
同時に複数のバッグを取得することはできません
そこで、EducationInfo から FetchType を完全に削除したところ、問題は解決しました。
解決
協会の反対側にOneToMany
の補数マッピングがManyToOne
で、それの のOneToOne
することはできません。それはEntityManager
が失敗しているものです。
これは、あなただけUser
とするOneToMany
が残っているので、おそらくAddress
がAddress
するOneToOne
リンクを持っていない、ここでは図示しないが、あなたが、User
から最後の行を削除するときに動作します。
私はScalaの専門家です。 Javaで、あなたは通常、エラーとEntityManager
の初期化に失敗したときに印刷されたスタックトレースを取得します。エラーメッセージは、常に非常にわかりやすいではないが、通常、それはとの問題を抱えているものをマッピング言います。おそらく、あなたは、あなたがそのエラーを取得しない場合は、あなたのログ設定を微調整する必要があります。
私は非常にあなたのモデルを理解しませんでした。
基本的には、利用者のことができるようになり 複数のアドレスを持っているので、私はそれを期待 多対多、しかし、それぞれの使用になります また、いくつかのインスタンスを持つことができます 教育情報、それほどの必要性 ManyToOneます。
これはUser
するAddress
から@OneToManyとして(意味 "ユーザー" を "使用する" 場合)私とにUser
するEducationInfo
から@OneToManyのように聞こえます。
今EducationInfoが持っています 各行がので、ユーザにOneToOne 人に一意であるが、私はしたいです すべての教育をロードすることができ 情報は、ユーザ名を与えられます。
上記と競合こと。どちらかあなたはEducationInfo
ごとに複数のUser
を持つことができるか、それは「人にユニークな」です。