2014-11-24 66 views
0

내가 다른 일반적인 클래스를 확장 제네릭 클래스가 있습니다. 모두는 @MappedSuperclass입니다. 그래서 그들은 데이터베이스에 자신의 테이블을 가지고 있지 않습니다. 그것들은 추상적이기 때문에 어떤 물건도 갖지 못합니다. 그들은 단지 내 기관targetEntity.Error로 일반적인 클래스 @MappedSuperclass 적용 : models.Unit.parent에 @ManyToOne 알 수없는 개체를 참조 : models.GenericHierarchic

내 상속 구조 @Entity를위한 스 켈러됩니다 단위

Generic -> GenericDictionary -> GenericHierarchicalDictionary -> 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 dosnt 작업. 내가 바로 그 오류가 발생하는 경우, 내가 @Entity 주석 targetEntity에 자바 클래스를 지정한다

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] 

하지만 내가하고 싶은 것이 아니다 : 나는 오류를 얻고있다.

내가 @ManyToOne targetEntity을하고 싶은

는 엔티티의 컨텍스트에서 동적으로 선언했다.

어떻게이 achive 수 있습니까? 도움을 좀주세요.

답변

-1

나는이 늦은 답장을 알고 있지만 해결책은 여전히 ​​여기에 필요한 경우 간다. GenericHierarchicalDictionary는 추상 클래스이기 때문에

이 문제입니다. Hibernate는 프로퍼티가 참조하는 엔티티 타입을 모른다. 대신 상속 클래스를 유형 (이 경우 Unit)으로 사용하면됩니다.

그래서 재산은 다음과 같습니다 -

공공 T 부모;

대신

public GenericHierarchicalDictionary parent;

내가 우리 말에 같은 문제를 해결하는 방법입니다. 희망이 도움이!

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

모든 작업을 수행

+0

내가 그것을 확인,하지만 지금은 봄으로 전환은 그냥 상자 밖으로 작동했다. 하지만 대답 해줘서 고마워. – masterdany88

+0

오, 그래.당신이 날은 봄에 상자 밖으로 가능한 방법을 알려 주시기 바랍니다 수 있을까요? 나는 봄을 사용하고 있지만 위에서 언급 한 방식대로했습니다. 내 대답을 확인 – fretswitch

+0

. 희망은 내가 도와; D 조 – masterdany88