簡體   English   中英

兩個實體之間的JPA OneToOne和ManyToMany

[英]JPA OneToOne and ManyToMany between two entities

我早些時候問了一個問題,但認為還不夠清楚,我將不進一步闡述代碼。
我有一個教師實體和一個部門實體
許多老師屬於一個系
一個系有一名系主任。
這是我實現它的方式。

@Entity
public class Teacher extends Model {
@Required
public String surname;

@Required
public String othernames;

    ... 

@OneToOne(mappedBy = "deptHead")
public Department headedBy = new Department();

@ManyToOne(cascade=CascadeType.ALL)
public Department dept = new Department();

... 
}

和部門實體

@Entity
public class Department extends Model {
@Required
public String deptName; 

@OneToMany(mappedBy="dept")
public List<Teacher> teachers = new ArrayList<Teacher>();

@OneToOne
public Teacher deptHead = new Teacher();

    ...

}

我收到以下錯誤

    @6c4nj8nmg
    Internal Server Error (500) for request GET /

    JPA error
    A JPA error occurred (Unable to build EntityManagerFactory): could not instantiate   test objectmodels.Department

    play.exceptions.JPAException: Unable to build EntityManagerFactory
    at play.db.jpa.JPAPlugin.onApplicationStart(JPAPlugin.java:269)
    at play.plugins.PluginCollection.onApplicationStart(PluginCollection.java:525)
    at play.Play.start(Play.java:526)
    at play.Play.detectChanges(Play.java:630)
    at play.Invoker$Invocation.init(Invoker.java:198)
    at Invocation.HTTP Request(Play!)
    Caused by: org.hibernate.InstantiationException: could not instantiate test objectmodels.Department
    at org.hibernate.engine.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:48)
    at org.hibernate.engine.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:67)
    at org.hibernate.tuple.PropertyFactory.buildIdentifierProperty(PropertyFactory.java:67)
    at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:135)
    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:485)
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:133)
    at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:286)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
    at play.db.jpa.JPAPlugin.onApplicationStart(JPAPlugin.java:267)
    ... 5 more
    Caused by: java.lang.reflect.InvocationTargetException
    at  org.hibernate.engine.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:45)
    ... 15 more
     Caused by: java.lang.StackOverflowError
    at java.lang.Class.searchMethods(Unknown Source)
    at java.lang.Class.getMethod0(Unknown Source)
    at java.lang.Class.getMethod(Unknown Source)
    at      play.classloading.enhancers.PropertiesEnhancer$FieldAccessor.invokeWriteProperty(PropertiesEnhancer.java:268)
    at models.Department.<init>(Department.java:23)
    at models.Teacher.<init>(Teacher.java:47)
    at models.Department.<init>(Department.java:26)
    ...

在這些方面需要幫助

這不是JPA問題,而是由Teacher / Department遞歸實例化引起的。

當您創建或要求JPA創建Teacher的實例時, Teacher嘗試實例化Department ,實例化Teacher ...到無窮大。

因此,您會在該堆棧跟蹤的結尾附近看到一個StackOverflowError錯誤。

從類定義中刪除= new Teacher()= new Department()表達式; 創建它們時,請依賴並使用適當的setter方法。

我刪除了Teacher和Department之間的@oneToOne關系,並創建了一個名為DepartmentHeads的新實體,現在一切正常。
這是結果。

@Entity
public class Teacher extends Model {
    @Required
    public String surname;

    @Required
    public String othernames;

    ... 

    @ManyToOne(cascade=CascadeType.ALL)
    public Department dept = new Department();

    ... 
}

@Entity
public class Department extends Model {
    @Required
    public String deptName; 

    @OneToMany(mappedBy="dept")
    public List<Teacher> teachers = new ArrayList<Teacher>();

    ...

}

@Entity
public class DepartmentHead extends Model{
    @OneToOne
    public Teacher teacher = new Teacher();

    @OneToOne
    public Department dept = new Department();  
}

現在一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM