java - 将嵌套的对象列表持久保存到同一个表中 JPA hibernate
问题描述
我已经开始使用 JPA(休眠)。我正在尝试将我班级中的嵌套对象列表映射到表格。根据我的理解尝试了以下方法。当我用谷歌搜索时,我可以找到一些基于每个实体有两个不同的表并加入它们的解决方案。但是,我想为以下设置维护一个表。
@Entity
@Table(name="Attendance")
public class Attendance
{
@Id
@Column(name="Id")
int id;
@Embedded
@OneToMany
List<SessionsMissed> days;
//Other members, getters, setters
}
@Embeddable
public Class SessionsMissed{
@Column(name="Date")
String date;
@Column(name="Session1")
String presentForOne;
@Column(name="Session2")
String presentForTwo;
//Other members, getters, setters
}
这个问题可能是由于我对这些概念缺乏理解,并且我没有使用正确的关键字进行搜索。感谢任何帮助。当我运行代码时,我收到以下错误:
无法初始化 JPA EntityManagerFactory:使用 @OneToMany 或 @ManyToMany 以未映射的类为目标:com.demo.entities.Attendance.days[com.demo.entities.SessionsMissed]
错误堆栈:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.demo.entities.Attendance.days[com.demo.entities.SessionsMissed]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786) ~[spring-beans-5.3.6.jar:5.3.6]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602) ~[spring-beans-5.3.6.jar:5.3.6]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.6.jar:5.3.6]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.6.jar:5.3.6]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.6.jar:5.3.6]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.6.jar:5.3.6]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.6.jar:5.3.6]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.6.jar:5.3.6]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.6.jar:5.3.6]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.6.jar:5.3.6]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:782) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:774) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340) ~[spring-boot-2.4.5.jar:2.4.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) ~[spring-boot-2.4.5.jar:2.4.5]
at com.demo.demoApplication.main(demoApplication.java:16) ~[classes/:na]
Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.demo.entities.Attendance.days[com.demo.entities.SessionsMissed]
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1351) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:874) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:799) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:53) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1693) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1661) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.6.jar:5.3.6]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.6.jar:5.3.6]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.6.jar:5.3.6]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.6.jar:5.3.6]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.6.jar:5.3.6]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845) ~[spring-beans-5.3.6.jar:5.3.6]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ~[spring-beans-5.3.6.jar:5.3.6]
... 17 common frames omitted
解决方案
One To Many
属性值类型不应该是Embeddable
.
如果您想使用可嵌入类型,您可以执行以下操作@ElementCollection
:
@ElementCollection主要用于映射非实体(可嵌入或基本),而@OneToMany用于映射实体。
@Entity
@Table(name = "Attendance")
public class Attendance {
@Id
@Column(name = "Id")
int id;
@ElementCollection
private List<SessionsMissed> days;
// getter / setter ..
}
@Embeddable
public class SessionsMissed {
@Column(name = "Date")
String date;
@Column(name = "Session1")
String presentForOne;
@Column(name = "Session2")
String presentForTwo;
// getter / setter ..
}
您可以查看定义的简短而详细的解释。https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#annotations-jpa-elementcollection
推荐阅读
- android - 如果我使用 APK 文件安装,是否默认启用运行时权限?
- hyperlink - XFN (XHTML Friends Network) 还在使用吗?
- javascript - VueJS:获取数据到 Vue
- sql - SQL Sum 在asp页面上显示语句而不是值
- javascript - 在Javascript中分配对象内部的数组
- python-3.x - 为什么这个队列不能正常工作?
- google-cloud-dataprep - Google Cloud Dataprep - 如何替换字符串中的模式
- xml - 如何使用 Marlogic 将 XML 中的新节点从 document1 替换为 document 2?
- java - 如何使用java为xml中的属性设置前缀
- javascript - URL 未通过 NavigationController 更改