获取mappedBy在应用启动时引用未知的目标实体属性异常

时间:2017-09-28 17:08:51

标签: java hibernate jpa spring-boot

我有两个实体,其中一个我正在使用用户输入的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

}

我无法在代码中找出问题。

2 个答案:

答案 0 :(得分:1)

AFAIK Hibernate需要每个实体的no-arg构造函数。由于EmployeeDepartment都定义了显式构造函数,因此必须定义no-arg构造函数

答案 1 :(得分:0)

删除

@OneToMany(mappedBy = "employee")
private Set<Department> departments = new HashSet<Department>();

由于您不需要它们,还有一件事只是将所有表格名称保留为小写,这是最佳做法之一。我认为这样可以解决您的问题。