两个实体之间的 JPA OneToOne 和 ManyToMany [英] JPA OneToOne and ManyToMany between two entities

查看:18
本文介绍了两个实体之间的 JPA OneToOne 和 ManyToMany的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我之前问过一个问题,但觉得还不够清楚,我会用代码进一步详细说明.
我有一个教师实体和部门实体
许多教师属于一个部门,
一个系有一名教师担任系主任.
这是我的实施方式.

I asked a question earlier, but think it wasn't clear enough i will elaborate further with the code.
I have a Teacher entity and Department entity
Many Teachers belongs to One Department and
One Department has One Teacher who heads the Department.
Here is how I am implementing it.

@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 的递归实例化引起的.

This is not a JPA problem, but is caused by recursive instantiation of Teacher/Department.

当您创建或要求 JPA 创建 Teacher 的实例时,Teacher 会尝试实例化一个 Department,它会实例化一个老师 ...,到无穷大.

When you create, or ask JPA to create, an instance of Teacher, the Teacher attempts to instantiate a Department, which instantiates a Teacher ..., to infinity.

因此,您会在堆栈跟踪末尾附近看到 StackOverflowError 错误.

Hence you're seeing a StackOverflowError error near the end of that stack trace.

从类定义中删除 = new Teacher()= new Department() 表达式;创建时依赖并使用适当的 setter 方法.

Remove the = new Teacher() and = new Department() expressions from the class definition; depend on and use appropriate setter methods when you create them.

这篇关于两个实体之间的 JPA OneToOne 和 ManyToMany的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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