代码之家  ›  专栏  ›  技术社区  ›  Andrea D'Attero

创建名为“entityManagerFactory”的bean时出错:Property“com.example.shopping.models.Account.orders”不是集合

  •  0
  • Andrea D'Attero  · 技术社区  · 2 年前

    大家好,我是Springboot的初学者,我需要一些设置方面的帮助,不知何故,当我启动spring应用程序时,它会抛出以下错误:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name
    'entityManagerFactory' defined in class path resource 
    [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]:
    Property 'com.example.shopping.models.Account.orders' is not a collection and
    may not be a '@OneToMany', '@ManyToMany', or '@ElementCollection'
    

    Account模型如下所示:

    package com.example.shopping.models;
    
    import jakarta.persistence.Entity;
    import jakarta.persistence.GeneratedValue;
    import jakarta.persistence.GenerationType;
    import jakarta.persistence.Id;
    import jakarta.persistence.OneToMany;
    
    @Entity
    public class Account {
        
        @Id
        @GeneratedValue(strategy= GenerationType.SEQUENCE, generator="account_id")
        private Long id;
    
        public String name;
    
        public String email;
    
        @OneToMany()
        public Iterable<Order> orders;
    
    }
    

    我还有如下订单模型:

    package com.example.shopping.models;
    
    import jakarta.persistence.Entity;
    import jakarta.persistence.GeneratedValue;
    import jakarta.persistence.GenerationType;
    import jakarta.persistence.Id;
    import jakarta.persistence.ManyToOne;
    import jakarta.persistence.OneToMany;
    
    @Entity
    public class Order {
        @Id
        @GeneratedValue(strategy= GenerationType.SEQUENCE, generator="order_id")
        private Long id;
        
        @Id
        public Long accountId;
        
        @ManyToOne
        public Account account;
    
        @OneToMany()
        public Iterable<ProductOrder> products;
    }
    

    这是application.properties文件:

    ## default connection pool
    spring.datasource.hikari.connectionTimeout=20000
    spring.datasource.hikari.maximumPoolSize=5
    
    ## PostgreSQL
    spring.datasource.url=jdbc:postgresql://localhost:5432/shopping?createDatabaseIfNotExist=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8&amp;amp;autoReconnect=true
    spring.datasource.username=postgres
    spring.datasource.password=test
    
    # create and drop table, good for testing, production set to none or comment it
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.generate-ddl=true
    app.db.init.enabled=true
    spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
    

    这是pom.xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.2.1</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>shopping</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>shopping</name>
        <description>Shopping project for Spring Boot</description>
        <properties>
            <java.version>21</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</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.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-boot-starter</artifactId>
                <version>3.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>3.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    我没有创建数据库,我认为它应该由Spring自动创建,表也正确吗?

    2 回复  |  直到 2 年前
        1
  •  2
  •   Andrei Lisa    2 年前

    你得到的错误告诉你必须改变什么。

    属性“com.example.shopping.models.Account.orders”不是 集合,并且可能不是“@OneToMany”、“@ManyToMany”或 '@ElementCollection'

    要修复它,您必须更换

        @OneToMany
        public Iterable<Order> orders;
    

    收件人:

    @OneToMany
    public List<Order> orders;
    

    而且

        @OneToMany
        public Iterable<ProductOrder> products;
    

    使用 List 而不是 Iterable

        2
  •  1
  •   mentallurg    2 年前

    错误消息解释了问题所在:Account.orders不是集合。将Account.orders定义为集合,例如,定义为集合。

    @OneToMany
    private Set<Order> orders;