1

他のジェネリック クラスを拡張するジェネリック クラスがあります。それらはすべてです@MappedSuperclass。したがって、データベースに独自のテーブルがありません。また、抽象的であるため、オブジェクトはありません。それらは私のエンティティの単なるスケルトンです@Entity

私の継承構造:

Generic -> GenericDictionary -> GenericHierarchicalDictionary -> Unit

Unit は@Entityクラスで、オブジェクトがあります。

@Entity
public class Unit extends GenericHierarchicalDictionary<Unit> {}

ユニットエンティティは階層構造を持っているため、エンティティはそれ自体と関係がありますが、そのために抽象クラス(@MappedSuperclass)を使用しているため、その抽象クラスで動的に定義したいと思います。

私のGenericHierarchicalDictionary:

@MappedSuperclass
public abstract class GenericHierarchicalDictionary<T extends Generic<T>> extends GenericDictionary<T> {
    @Required
    @ManyToOne(targetEntity = GenericHierarchicalDictionary.class, fetch=FetchType.LAZY, cascade = {CascadeType.ALL})
    @JoinColumn(name="parent_id")
    public GenericHierarchicalDictionary<T> parent;

しかし、idは機能しません。エラーが発生します:

play.api.UnexpectedException: Unexpected exception[PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to configure EntityManagerFactory]
        at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:148) ~[play_2.10.jar:2.2.4]
        at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:112) ~[play_2.10.jar:2.2.4]
        at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
        at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:112) ~[play_2.10.jar:2.2.4]
        at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:110) ~[play_2.10.jar:2.2.4]
        at scala.util.Success.flatMap(Try.scala:200) ~[scala-library.jar:na]
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to configure EntityManagerFactory
        at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:378) ~[hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
        at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) ~[hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) ~[hibernate-jpa-2.0-api.jar:1.0.1.Final]
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) ~[hibernate-jpa-2.0-api.jar:1.0.1.Final]
        at play.db.jpa.JPAPlugin.onStart(JPAPlugin.java:35) ~[play-java-jpa_2.10.jar:2.2.4]
        at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:88) ~[play_2.10.jar:2.2.4]
Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on models.Unit.parent references an unknown entity: models.GenericHierarchicalDictionary
        at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:107) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final]
        at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1580) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final]
        at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1503) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final]
        at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1419) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final]
        at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final]
        at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1519) ~[hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]

そのエラーが正しければ、targetEntity に@Entity注釈付きの Java クラスを割り当てる必要がありますが、それは私が望むものではありません。

@ManyToOne targetEntity をエンティティのコンテキストから動的に宣言したいと思います。

どうすればこれを達成できますか? 助けてください。

4

2 に答える 2

0

これは、春に実装された私の階層的なジェネリック クラス (抽象的でマップされたスーパークラス) です。

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToMany;



@MappedSuperclass
public abstract class GenericHierarchicalModel<T extends GenericHierarchicalModel<T>> extends GenericModel<T> {
    private String name;
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private T parent;
    @OneToMany(mappedBy = "parent")
    private List<T> children;

    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public T getParent() {return parent;}
    public void setParent(T parent) {this.parent = parent;}
    public List<T> getChildren() {return children;}
    public void setChildren(List<T> children) {this.children = children;}


    public GenericHierarchicalModel() {
        super();
    }
    public GenericHierarchicalModel(Long id) {
        super(id);
    }
    public GenericHierarchicalModel(Long id, String name) {
        super(id);
        this.name = name;
    }
    public GenericHierarchicalModel(Long id, String name, List<T> children) {
        super(id);
        this.name = name;
        this.children = children;
    }

すべての仕事をします。私はそれのクラスに基づいて実装を行っています。私が助けてくれることを願っています。

この投稿を確認してください: Java hibernate/jpa 自己関連の動的汎用エンティティを作成する方法

于 2015-03-26T19:16:53.100 に答える
-1

これは返信が遅いことは承知していますが、それでも解決策が必要な場合は、こちらに進みます。

この問題は、GenericHierarchicalDictionary が抽象クラスであるためです。Hibernate は、プロパティが参照するエンティティ タイプを認識しません。代わりに、継承するクラスを型 (この場合は Unit) として使用する必要があります。

したがって、プロパティは次のようになります:-

public T 親;

それ以外の

public GenericHierarchicalDictionary 親;

これが、私が最後に同じ問題を解決した方法です。お役に立てれば!

于 2015-03-25T14:05:13.323 に答える