Spring Boot EntityManagerFactory未定义和@ManyToOne不允许。

4
我正在使用Spring Boot和JPA开发RESTful Web服务,但是遇到了以下问题:

[ERROR] 执行目标org.springframework.boot:spring-boot-maven-plugin:1.5.3.RELEASE:run (default-cli) 时出错,位于项目SpringRest中:运行时发生异常。空指针异常:创建EntityManagerFactory时出错,请参考[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class] 中的定义。初始化方法调用失败;嵌套异常信息为:@ManyToOne属性上不允许使用@Column(s)注解:com.maven.nurcanyilmaz.models.Employee.department

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
</parent>

<dependencies>

 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- JSTL for JSP -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>

    <!-- For JSP compilation -->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
  <groupId>javax.transaction</groupId>
  <artifactId>jta</artifactId>
  <version>1.1</version>
  </dependency>

  <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.5</version>
    </dependency>

   <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
     <scope>test</scope>
  </dependency>
</dependencies>

实体

@Entity
@Table(name="DEPARTMENT")
public class Department {

    @Id
    @Column(name="Id",nullable=false,unique=true)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    @Column(name="Description",nullable=false)
    private String description;

    @OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
    private List<Employee> employees;

    public Department() {
        // TODO Auto-generated constructor stub
    }

   @Entity
@Table(name="EMPLOYEE")
public class Employee {

    @Id
    @Column(name="Id",nullable=false,unique=true)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @Column(name="Name",nullable=false)
    private String name;

    @Column(name="Surname",nullable=false)
    private String surname;
    @Column(name="Salary",nullable=false)
    private double salary;

    @Column(name="Department" , nullable=false)
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "Id",referencedColumnName="Id")
    private Department department;

    public Employee() {
        // TODO Auto-generated constructor stub
    }

代码库

import com.maven.nurcanyilmaz.models.Employee;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource
public interface EmployeeRepository extends CrudRepository<Employee, Long> {

    Employee findByName(String name);

}


import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

import com.maven.nurcanyilmaz.models.Department;

@RepositoryRestResource
public interface DepartmentRepository extends CrudRepository<Department, Long> {

    Department findByName(String name);
}

application.properties

 spring.mvc.view.prefix: /WEB-INF/
spring.mvc.view.suffix: .jsp
server.port=8088

spring.datasource.url = jdbc:mysql://localhost:3306/EmployeeDb
spring.datasource.username =root
spring.datasource.password =test
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = create-drop

spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy


spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
server.error.whitelabel.enabled=false

1
关于异常有什么不清楚的呢?"@Column(s) not allowed on a @ManyToOne property"已经非常明确地说明了出现了什么问题。 - M. Deinum
3个回答

4
在私有部门中,Employee实体中使用了@Column和@JoinColumn两个注释可能会存在问题。查看你的实体,应该使用@JoinColumn而不是@Column。

谢谢你,但我仍然遇到了EntityManagerFactory异常。顺便说一下,@JoinColumn有两个作用。一个是给出名称,另一个是映射。所以我不能同时使用它们,这是正确的吗? - codeLover
InvocationTargetException: 在文件[/home/nurcan/workspace/SpringRest/target/classes/com/maven/controllers/DepartmentController.class]中定义的名为'departmentController'的bean创建错误:合并的bean定义后处理失败;嵌套异常是java.lang.IllegalStateException:指定的字段类型[interface com.maven.nurcanyilmaz.repositories.DepartmentRepository]与资源类型[javax.persistence.EntityManager]不兼容。 - codeLover
你不应该同时使用它们。我刚刚用@ JoinColumn替换了@ Column,错误消失了。谢谢@Madhu Reddy。 - David Jesus

3
Hibernate不允许在@ManyToOne注解中使用@Column注解。如果您想要指定列名,可以使用@JoinColumn注解。

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接