OneToMany
既に列があるクラスに列を追加するときに、EntityManager をインスタンス化できないことに苦労してい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 のインスタンス化を妨げるエラーを知る方法があるかどうかも知りたいのですが、主な問題は、この列をユーザーに追加するときに何が問題を引き起こしているのかということです。
アップデート:
間違っていた部分を削除しました。
更新 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 は問題を引き起こしませんが、 @OneToMany -> User からの EducationInfo は問題を引き起こします。
更新 4:
提案どおり、mappedBy を User エンティティに追加しました。動作しない定義が 5 つあるため、別の列定義でそれを使用しましたが、それらはすべて同じ理由であると考えているため、1 つだけでテストしています。残念ながら、それでも EntiyManagerFactory がビルドされないため、すべてのテストが失敗します。
最終更新:
実際にあったケースは
複数のバッグを同時に取得することはできません
そのため、FetchType を EducationInfo から完全に削除したところ、問題は解消されました。