将通用类@MappedSuperclass应用于models.Unit.parent上的targetEntity.Error:@ManyToOne未知实体:models.GenericHierarchic [英] Apply generic class @MappedSuperclass as targetEntity.Error: @ManyToOne on models.Unit.parent references an unknown entity: models.GenericHierarchic

查看:90
本文介绍了将通用类@MappedSuperclass应用于models.Unit.parent上的targetEntity.Error:@ManyToOne未知实体:models.GenericHierarchic的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有泛型类,可以扩展其他泛型类.它们都是@MappedSuperclass.因此,他们在数据库中没有自己的表.它们也是抽象的,因此它们没有任何对象.它们只是我的实体@Entity

I have generic class that extend other generic class. All of them is @MappedSuperclass. So they dont have own table in database. They are also abstract, so they dont have any objects. They are just skeleton for my entities @Entity

我的继承结构:

Generic -> GenericDictionary -> GenericHierarchicalDictionary -> Unit

单位是@Entity类并且有对象.

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

单元实体具有层次结构,这意味着实体与其自身具有关系,但是我为此使用了抽象类(@MappedSuperclass),因此我想在该抽象类中动态定义它:

Unit entity has hierarchical structure which means that Entity has relation to itself, but I am using abstract class (@MappedSuperclass) for that, so I would like define it dynamically in that abstract class:

我的GenericHierarchicalDictionary:

My 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不起作用.我遇到错误:

But id dosnt work. I am getting an error:

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]

如果我纠正了该错误,则应该为目标实体分配一个带有@Entity批注的Java类,但这不是我想要的.

If I get right that error, I should assign to targetEntity a java class with @Entity annotation, but it is not what I would like to have.

我想从实体的上下文中动态声明@ManyToOne targetEntity.

我该如何实现?请给我一些帮助.

How can I achive this? Please give me some help.

推荐答案

这是我在春季实现的分层通用类(抽象,映射超类):

Here is my hierarchical generic class (abstract, mapped superclass) implemented in spring:

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;
    }

做好所有工作.我有基于该类的工作实现.希望我能帮上忙.

Do all job. I have working implementation base on it class. Hope I will help.

检查此帖子: Java hibernate/jpa如何创建与自我相关的动态通用实体

这篇关于将通用类@MappedSuperclass应用于models.Unit.parent上的targetEntity.Error:@ManyToOne未知实体:models.GenericHierarchic的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆