web-dev-qa-db-ja.com

「非コレクションを@ OneToMany、@ ManyToMany、または@CollectionOfElementsとしてマップしようとする不正な試み」

おはようStackoverflow、

エラーが発生するという問題があります:

SessionFactoryオブジェクトの作成に失敗しました。

なぜなのかご存知ですか?

@OneToMany(cascade=CascadeType.ALL, targetEntity=CoachGroup.class)
@JoinColumn(name="id")
private TreeSet<CoachGroup> coachGroups = new TreeSet<>();
private SessionFactory factory;

private void initialiseFactory() {
    try {
        factory = new Configuration().configure().buildSessionFactory();
    } catch (Throwable ex) {
        System.err.println("Failed to create sessionFactory object." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}
23
mh123hack

例外は簡単で、次のとおりです:非コレクションを@ OneToMany、@ ManyToManyまたは@CollectionOfElementsとしてマップしようとする違法な試みです。そのため、ここで、また HibernateCollection mappingdocumentation それは明確に次のように述べています:

要件として、永続的なコレクション値フィールドはインターフェイスタイプとして宣言する必要があります(例7.2「@OneToManyおよび@JoinColumnを使用したコレクションマッピング」を参照)。実際のインターフェイスは、Java.util.SetJava.util.CollectionJava.util.ListJava.util.MapJava.util.SortedSetJava.util.SortedMap...のようになります。

そして、 TreeSet を使用しました。これは実装ですclassSet<E>およびSortedSet<E>インターフェイスの両方。したがって、実際のマッピングはTreeSetでは機能しません。Set<CoachGroup>ではなくTreeSet<CoachGroup>を使用する必要があります。

private Set<CoachGroup> coachGroups = new HashSet<CoachGroup>();
23
cнŝdk

実装ではなく、インターフェイスにマップする必要があります。この:

@OneToMany(cascade=CascadeType.ALL, targetEntity=CoachGroup.class)
@JoinColumn(name="id")
private TreeSet<CoachGroup> coachGroups = new TreeSet<>();

はずです(HashSetで十分なので、TreeSetも置き換えられます)。

@OneToMany(cascade=CascadeType.ALL, targetEntity=CoachGroup.class)
@JoinColumn(name="id")
private Set<CoachGroup> coachGroups = new HashSet<>();

エンティティフィールド宣言で具体的な実装を使用することはできません。次のいずれかを使用できます。

  • Java.util.List
  • Java.util.Set
  • Java.util.Collection

したがって、あなたの場合は次のようにする必要があります。

@OneToMany(cascade=CascadeType.ALL, targetEntity=CoachGroup.class)
@JoinColumn(name="id")
private Set<CoachGroup> coachGroups = new TreeSet<>();
1
Maciej Kowalski

コレクションフィールドを具象クラスとして保存することはできません。

これを得ました、

要件として、永続的なコレクション値フィールドはインターフェイスタイプとして宣言する必要があります(例7.2「@OneToManyおよび@JoinColumnを使用したコレクションマッピング」を参照)。実際のインターフェースは、Java.util.Set、Java.util.Collection、Java.util.List、Java.util.Map、Java.util.SortedSet、Java.util.SortedMap、または好きなもの(「好きなもの」)です。 org.hibernate.usertype.UserCollectionTypeの実装を記述する必要があることを意味します。

第7章コレクションマッピング から。

以下のコードを使用して、ソートされたセットを保存できます(コメントをよく読んでください):

@OneToMany(cascade=CascadeType.ALL) //Removed targetEntity, as you are already using generics.
@JoinColumn(name="team_id") // Use this name as to show the presence of foreign key of EducationTeam in CoachGroup.
@SortNatural // Make sure that your CoachGroup Entity has implemented Comparable<CoachGroup> interface which wii be used while sorting.
private SortedSet<CoachGroup> coachGroups = new TreeSet<>();
0