3

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 から完全に削除したところ、問題は解消されました。

4

1 に答える 1

3

OneToManyアソシエーションの反対側でのの補数マッピングはですがManyToOne、することはできませOneToOneEntityManagerそれが失敗の原因です。

から最後の行を削除すると機能します。これは、 toUserだけが残っており、ここには示されていませんが、おそらくへのリンクがないためです。OneToManyAddressAddressOneToOneUser

私はScalaの専門家ではありません。EntityManagerJavaでは通常、初期化に失敗するとエラーとスタックトレースが出力されます。エラーメッセージは必ずしも非常に説明的であるとは限りませんが、通常、どのマッピングに問題があるかを示します。エラーが発生しない場合は、ログ設定を微調整する必要があります。

私はあなたのモデルを完全に理解していませんでした:

基本的に、ユーザーは複数のアドレスを持つことができるはずなので、ManyToManyになると思いますが、使用するたびに教育情報のインスタンスもいくつか持つことができるため、ManyToOneが必要です。

これは、@ OneToMany from Userto Addressto meのように聞こえ、(「use」が「user」を意味する場合)@OneToManyfromtoからのUserように聞こえEducationInfoます。

現在、EducationInfoにはOneToOne to userがあります。これは、各行が個人に固有であるためですが、ユーザー名を指定してすべての教育情報をロードできるようにしたいと考えています。

それは上記と矛盾します。EducationInfoあなたはあたりにいくつかを持つことができるかUser、それは「人にユニーク」です。

于 2009-12-22T17:13:44.970 に答える