我有两个实体,其中一个我正在使用用户输入的PK。
启动springboot app时,我收到以下异常。
启动ApplicationContext时出错。显示自动配置 报告使用' debug'重新运行您的应用程序启用。 2017年9月28日 22:06:13.718 $ threadId:1 ERROR namespace:com.shop.tush o.s.b.SpringApplication [主机名:tusbanne.in.ibm.com serviceName:shoppingdetails版本:0.0.1-SNAPSHOT transactionId: conversationId:requestTimeStamp:responseTimeStamp:duration:] 应用启动失败 org.springframework.beans.factory.BeanCreationException:错误 创建名为&entityManagerFactory'的bean在类路径中定义 resource [com / shop / tush / DataConfiguration.class]:init的调用 方法失败;嵌套异常是org.hibernate.AnnotationException: mappedBy引用未知的目标实体属性: com.shop.tush.model.Department.employee in com.shop.tush.model.Employee.departments at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 在 org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) 在 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:314) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) 在com.shop.tush.Application.main(Application.java:70)引起: org.hibernate.AnnotationException:mappedBy引用一个未知的 目标实体属性:com.shop.tush.model.Department.employee in com.shop.tush.model.Employee.departments at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:769) 在 org.hibernate.cfg.annotations.CollectionBinder $ 1.secondPass(CollectionBinder.java:719) 在 org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54) 在 org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1655) 在 org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1623) 在 org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874) 在 org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370) 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ...省略了16个常见帧
我的实体类如下。
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="EMPLOYEE")
public class Employee {
@Id
@Column(name="NAME")
private String name;
@Column(name="PHONE_NUMBER")
private String phoneNumber;
@OneToMany(mappedBy = "employee")
private Set<Department> departments = new HashSet<Department>();
public Employee(String name, String phoneNumber, Set<Department> department) {
super();
this.name = name;
this.phoneNumber = phoneNumber;
this.departments = department;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public Set<Department> getDepartment() {
return departments;
}
public void setDepartment(Set<Department> department) {
this.departments = department;
}
//equals and hashcode methods overriden
}
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name="DEPARTMENT")
public class Department {
@Id
@Column(name="ID")
@SequenceGenerator(name="seq",sequenceName="dept_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
private Long deptId;
@Column(name="DEPT_NAME")
private String deptName;
@Column(name="DEPT_BOSS")
private String deptBoss;
@ManyToOne
@JoinColumn(name = "NAME", nullable = false)
private Employee employee;
public Department(Long deptId, String deptName, String deptBoss, Employee employee) {
super();
this.deptName = deptName;
this.deptBoss = deptBoss;
this.employee = employee;
}
public Long getDeptId() {
return deptId;
}
public void setDeptId(Long deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public String getDeptBoss() {
return deptBoss;
}
public void setDeptBoss(String deptBoss) {
this.deptBoss = deptBoss;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
//OVERRIDE EQUALS AND HASHCODE
}
我无法在代码中找出问题。
答案 0 :(得分:1)
AFAIK Hibernate需要每个实体的no-arg构造函数。由于Employee
和Department
都定义了显式构造函数,因此必须定义no-arg构造函数
答案 1 :(得分:0)
删除
@OneToMany(mappedBy = "employee")
private Set<Department> departments = new HashSet<Department>();
由于您不需要它们,还有一件事只是将所有表格名称保留为小写,这是最佳做法之一。我认为这样可以解决您的问题。