【问题标题】:While using OneToMany tags .. No Persistence provider for EntityManager - Hibernate JPA使用 OneToMany 标签时.. EntityManager 没有持久性提供程序 - Hibernate JPA
【发布时间】:2020-09-18 00:59:25
【问题描述】:

嗯,我一直在寻找这个问题,浪费了这么多时间,所以我在这里。

import javax.persistence.*;

@Entity
@Table(name = "secretario")
public class Secretario {
    @Id
    @GeneratedValue
    private long codigoS;
    @Column
    private String nombre;
    @ManyToOne
    @JoinColumn(name = "codigoE")
    private Empleado e;
import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;

@Entity
@Table
public class Empleado implements Serializable {

    private static final long serialVersionUID = 1l;
    @Id
    @Column
    @GeneratedValue
    private long codigoE;
    @Column
    private String apellido;
    @Column
    private String nombre;
    @OneToMany(mappedBy = "e")
    private ArrayList<Secretario> secretario;

当我使用 OneToMany 和 ManyToOne 标签时,我得到了这个异常,我不知道为什么......或者如何......

INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named Persistencia
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at tests.TestEmpleados.main(TestEmpleados.java:22)

这是我的持久化配置

<?xml version="1.0" encoding="UTF-8" ?>

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">


    <persistence-unit name="Persistencia">
        <!-- <description>
             Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
         </description>-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- Representar clases -->
        <class>model.Empleado</class>
        <class>model.Secretario</class>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hibernate"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value=""/>

            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>

</persistence>

还有我的 Maven 配置

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Hibernate</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.3.1.Final</version>
        </dependency>
        <!--<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.3.1.Final</version>
        </dependency>-->
        <!-- https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api -->
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

我使用@Transient 标记修复了某种方式,并且我的实体被正确持久化,但是当我尝试查询它们时,我在 OneToMany 关系 bcz 中得到一个空值,它告诉 hibernate 不要使用该属性做某事......


        emf = Persistence.createEntityManagerFactory("Persistencia");
        manager = emf.createEntityManager();

这是异常显示的地方

@更新

不知何故,我发现@OneToMany 只接受集合类型作为列表、集合、地图等,但不接受“ArrayList”,我只是更改了数据类型,它工作正常..

【问题讨论】:

  • 请发布完整的堆栈跟踪,看起来像是持久性 xml 的问题。

标签: java hibernate jpa


【解决方案1】:

@Transient - 告诉 hibernate 不要持久化这些字段,这就是为什么你在这个字段上有 null 的原因。这也是为什么你不会再遇到问题的原因。

@ManyToOne 默认是惰性的,所以你应该在事务中获取它们。

如果您使用 JPA,您可以通过 @Transactional 使用此属性来注释方法。或者,您可以使用 EntityManager 中的方法 beginTransaction()、endTransaction()。 只要您的实体离开事务范围,错误就会再次发生。因此,在脱离事务范围之前将您的实体转换为 dto。

另一种解决方案,您可以将字段注释为 Eager,因此它们将从具有父实体的数据库中下载。

但 Eager - 不好的解决方案,如果不知道它是什么,请不要使用它。

【讨论】:

  • 这似乎是一个标签问题,而不是关系中的 Lazy getter,bcz 只有在我明确使用它时才会发生:(
【解决方案2】:

我会尝试回答这个问题,但某些事情取决于您的设置,即用作 Java SE 或 J2EE 应用程序。

对于 Java SE,请确保您的持久性文件位于资源文件夹下的 META-INF/persistence.xml 中,请检查此 articledocs

对于 J2EE 应用程序,您通常在服务器配置中配置 JNDI 名称,然后在您的 persistence.xml 中使用该 JNDI 名称。

另外,请检查您的所有数据库凭据并手动检查对其的访问权限并跟踪堆栈跟踪,它会完整地告诉您出了什么问题。

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 2012-11-03
    • 1970-01-01
    • 2016-11-04
    • 2012-06-21
    • 2019-01-16
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多