为了账号安全,请及时绑定邮箱和手机立即绑定

创建名为“entityManagerFactory”的 bean 时出错,无法正常运行应用程序

创建名为“entityManagerFactory”的 bean 时出错,无法正常运行应用程序

精慕HU 2023-07-19 10:49:17
我的SpringBoot应用程序无法正常运行。尝试更改依赖项、类路径、删除并在本地 .m2 中使用 hibernate 重新安装整个文件夹。我正在我的应用程序中制作 Spring boot 安全登录系统,在此之前,一切都很好。更改依赖项、类路径、删除并重新安装本地 .m2 中的 hibernate 整个文件夹<dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-jpa</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-jdbc</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-thymeleaf</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!--SWAGGER  -->        <dependency>            <groupId>io.springfox</groupId>            <artifactId>springfox-swagger2</artifactId>            <version>2.9.2</version>            <scope>compile</scope>        </dependency>        <dependency>            <groupId>io.springfox</groupId>            <artifactId>springfox-swagger-ui</artifactId>            <version>2.9.2</version>            <scope>compile</scope>        </dependency>        <dependency>            <groupId>org.hibernate.validator</groupId>            <artifactId>hibernate-validator</artifactId>            <version>6.0.16.Final</version>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-entitymanager</artifactId>            <version>5.4.4.Final</version>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-core</artifactId>            <version>5.4.4.Final</version>        </dependency>        <dependency>            <groupId>org.hibernate.javax.persistence</groupId>            <artifactId>hibernate-jpa-2.1-api</artifactId>            <version>1.0.2.Final</version>        </dependency>
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

问题在于您如何定义实体。超类和子类都有@Id属性。

继承应该由IS-A HAS-A 关系来管理。

因此,@Id子类中的 应该被排除,因为子类的实例应该可以被超类的对应实例识别@Id,这意味着子类必须具有@Id超类的属性(继承树)。

此外,您的超类必须有一个@Id,因此快速解决方案是摆脱子@Id类中的 ,并在子类中添加相同的属性(不带@Id注释)。

/* Class level annotations */

public class Role { //Superclass

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    @Column(name = "role_id")

    private Integer roleId;

}


/* Class level annotations */

public class UserApp  extends Role { //Subclass

    private Integer roleId; // Same as the @Id in superclass

}


查看完整回答
反对 回复 2023-07-19
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

确保您的 application.properties 文件具有正确的数据库 URL。还要检查实体名称是否正确。这是创建数据库连接时的常见错误。



查看完整回答
反对 回复 2023-07-19
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

您正在对 JPA 实体使用继承:UserApp 扩展 Role,但同时您声明 UserApp 应该拥有它自己的 @Id。这里的问题是您试图将域实体的继承映射到关系数据库。SQL 不直接支持这种关系,而 Hibernate 或任何其他 JPA 实现必须将其映射到支持的概念。

您可以在 4 种策略中进行选择,将域模型的继承结构映射到不同的表结构:映射超类、每个类表、单表或连接表方法。这些策略都有其优点和缺点。您应该选择最适合您的用例的一种。

同时,我使用您的配置和您提供的代码在我的计算机上重现了该问题,正如我所提到的,UserApp 类中用 @Id 注释的字段导致了问题。快速修复选项之一是删除 UserApp 中的此字段。因此,以下代码在我的机器上运行测试效果很好:

@NoArgsConstructor

@Data

@Entity

@Table(name = "user")

public class UserApp extends Role {


    private String name;

    private String password;

    private int active;


    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)

    @JoinTable(name = "user_role",

            joinColumns =

            @JoinColumn(name = "user_id"),

            inverseJoinColumns = @JoinColumn(name = "role_id"))

    private Set<Role> roles;


    public UserApp(UserApp userApp) {


    }

}

正如您在评论之一中提到的,此错误发生在默认测试中(不是您编写的) - 如果您只想构建,总是有一个选项可以跳过它:


mvn clean install -DskipTests


查看完整回答
反对 回复 2023-07-19
  • 3 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信