Reputation: 1725
I have two entities, in one of which i am using a PK which is user entered.
I am getting the below exception when starting the springboot app.
Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled. 2017-09-28 22:06:13.718 $ threadId:1 ERROR namespace:com.shop.tush o.s.b.SpringApplication [ hostname:tusbanne.in.ibm.com serviceName:shoppingdetails version:0.0.1-SNAPSHOT transactionId: conversationId: requestTimeStamp: responseTimeStamp: duration:] Application startup failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/shop/tush/DataConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.shop.tush.model.Department.employee in com.shop.tush.model.Employee.departments at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) at com.shop.tush.Application.main(Application.java:70) Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.shop.tush.model.Department.employee in com.shop.tush.model.Employee.departments at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:769) at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:719) at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1655) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1623) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874) at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ... 16 common frames omitted
My entity classes are as below.
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
}
I am not able to figure out the issue in the code.
Upvotes: 0
Views: 2567
Reputation: 1515
Remove
@OneToMany(mappedBy = "employee")
private Set<Department> departments = new HashSet<Department>();
As you don't need them, and one more thing keep all the table names in lowercase only, it's among best practices.I think it will resolve your issue.
Upvotes: 0
Reputation: 66
AFAIK Hibernate needs no-arg constructor for each entity. Since both Employee
and Department
have explicit constructors defined no-arg constructor has to be defined as well
Upvotes: 1