Tushar Banne
Tushar Banne

Reputation: 1725

Getting mappedBy reference an unknown target entity property exception on app startup

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

Answers (2)

Vipul Jain
Vipul Jain

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

Jan W
Jan W

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

Related Questions