java Hibernate HSQLDB - DuplicateMappingException
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/35162496/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Hibernate HSQLDB - DuplicateMappingException
提问by mattsky
I'm writing simple "todo" application in Spring Boot. I'm using HSQLDB in my development environment.
我正在 Spring Boot 中编写简单的“todo”应用程序。我在我的开发环境中使用 HSQLDB。
I've got two tables "Project" and "Task". Task table has one to many reference to project's table because I want to list all tasks in projects.
我有两个表“项目”和“任务”。任务表对项目表有一对多的引用,因为我想列出项目中的所有任务。
When I try to run my app I get an exception:
当我尝试运行我的应用程序时,出现异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.4.0.BUILD-SNAPSHOT.jar:1.4.0.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:768) [spring-boot-1.4.0.BUILD-SNAPSHOT.jar:1.4.0.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.4.0.BUILD-SNAPSHOT.jar:1.4.0.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.4.0.BUILD-SNAPSHOT.jar:1.4.0.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1170) [spring-boot-1.4.0.BUILD-SNAPSHOT.jar:1.4.0.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1159) [spring-boot-1.4.0.BUILD-SNAPSHOT.jar:1.4.0.BUILD-SNAPSHOT]
at pl.mattscode.taskman.TaskmanApplication.main(TaskmanApplication.java:10) [classes/:na]
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1249) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access0(EntityManagerFactoryBuilderImpl.java:120) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.perform(EntityManagerFactoryBuilderImpl.java:860) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.perform(EntityManagerFactoryBuilderImpl.java:850) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) ~[spring-orm-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) ~[spring-orm-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
... 16 common frames omitted
Caused by: org.hibernate.DuplicateMappingException: Same physical table name [project] references several logical table names: [project], [Project]
at org.hibernate.cfg.Configuration$MappingsImpl.addTableBinding(Configuration.java:3172) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.annotations.TableBinder.buildAndFillTable(TableBinder.java:321) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.annotations.TableBinder.buildAndFillTable(TableBinder.java:339) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.annotations.EntityBinder.bindTable(EntityBinder.java:594) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:677) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.perform(EntityManagerFactoryBuilderImpl.java:857) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
... 24 common frames omitted
This is my hibernate entities classes:
这是我的休眠实体类:
Project
项目
@Entity
@Table(name="project")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "project_id")
private Long projectId;
@Column
private String name;
public Long getId() {
return projectId;
}
public void setId(Long id) {
this.projectId = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Task
任务
@Entity
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@ManyToOne
@JoinColumn(name = "project_id")
private List<Project> projectId;
public List<Project> getProjectId() {
return projectId;
}
public void setProjectId(List<Project> projectId) {
this.projectId = projectId;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
And this is the way how I query the database.
这就是我查询数据库的方式。
ProjectRepository
项目库
@Repository
public interface ProjectRepository extends JpaRepository<Project, Long> {
@Query("select t.name from Task t inner join Project p on t.id = p.id")
List<Task> getProjectsWithTasks();
}
Can anyone help me to solve the problem?
谁能帮我解决问题?
EDIT:I added @Table(name="project")
, change @JoinTable
to @JoinColumn
and I have another error:
编辑:我添加@Table(name="project")
,更改@JoinTable
为@JoinColumn
,我有另一个错误:
org.hibernate.AnnotationException: @OneToOne or @ManyToOne on pl.mattscode.taskman.task.repository.entity.Task.projectId references an unknown entity: java.util.List
采纳答案by Rupesh
If it is @ManytoOne
then the field type should not be a list, if you want a collection of Projects then it should be @OneToMany
annotation
如果是,@ManytoOne
那么字段类型不应该是列表,如果你想要一个项目集合,那么它应该是@OneToMany
注释
I have modified the files if you would like to try them.
如果您想尝试,我已经修改了这些文件。
@Entity
public class Project
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "project_id")
private Long projectId;
@Column
private String name;
@OneToMany
@JoinColumn(name = "task_id")
private List<Task> task;
public List<Task> getTask()
{
return task;
}
public void setTask(final List<Task> task)
{
this.task = task;
}
public Long getId()
{
return projectId;
}
public void setId(final Long id)
{
this.projectId = id;
}
public String getName()
{
return name;
}
public void setName(final String name)
{
this.name = name;
}
}
@Entity
public class Task
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
public Long getId()
{
return id;
}
public void setId(final Long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(final String name)
{
this.name = name;
}
}
回答by Raja Fawad
I had two entity classes referring to same table. I was using only one file . It did not had any issue with mysql db but for oracle after googling and stuff i solved the issue by deleting that other entity class . So keep only one entity class per table dnt keep two not even for some other reason.
我有两个实体类引用同一个表。我只使用了一个文件。它在 mysql db 上没有任何问题,但是在谷歌搜索之后的 oracle 和我通过删除其他实体类解决了这个问题。因此,每个表只保留一个实体类,即使出于其他原因也不要保留两个。
回答by Rupesh
@JoinTable is trying to create another table entry with same name Project. In your Task Entity replace:
@JoinTable 正在尝试创建另一个具有相同名称 Project 的表条目。在您的任务实体中替换:
@ManyToOne
@JoinTable(name="project",
joinColumns = @JoinColumn(name = "project_id"))
to
到
@JoinColumn(name = "project_id")