且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

什么是gradle缺少映射休眠?

更新时间:2022-10-23 21:54:12

我认为这个问题不是真的与gradle。事实上,JPA规范愚蠢地要求实体的类与persistence.xml文件在同一个jar /目录中。由于Gradle并未将编译的资源与编译的类存储在相同的输出目录中,因此Hibernate没有找到映射的实体。



将此行添加到你的gradle构建,它可能会很好

  sourceSets.main.output.resourcesDir = sourceSets.main.output.classesDir 


I have unittest to my java project.

My code uses hibernate.

When i run the test using junit - everything passes.

When I run the test using gradle - I get a mapping error:

Caused by: org.hibernate.MappingException: Unknown entity: linqmap.users.interfaces.model.UserRecord

and the class:

@Entity
@Table(name = "users")

public class UserRecord implements Serializable {

    private static final long serialVersionUID = 1L;
    public static short CLASS_VERSION = 3;

    @Transient
    public short objectVersion = CLASS_VERSION;

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "id")
    public long ID;

    @Column(name = "user_name")
    public String userName;

    @Column(name = "email")
    public String email;

    @Column(name = "full_name") // will be deprecated in the future
    public String fullName;

    @Column(name = "password")
    public String password;

and a config file:

<persistence xmlns="http://java.sun.com/xml/ns/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_1_0.xsd"
    version="1.0">

    <persistence-unit name="UsersDB">

        <!-- The provider only needs to be set if you use several JPA providers <provider>org.hibernate.ejb.HibernatePersistence</provider> -->

        <properties>
            <!-- Scan for annotated classes and Hibernate mapping XML files -->
            <property name="hibernate.archive.autodetection" value="class, hbm" />

            <!-- SQL stdout logging <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> 
                <property name="use_sql_comments" value="true"/> -->

            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
            <property name="hibernate.connection.url" value="dbc:postgresql://localhost:9992/israel" />

what can be missing in gradle?

I think the problem is not really with gradle. It's with the fact that the JPA spec stupidly requires that the classes of the entities are in the same jar/directory as the persistence.xml file. And since Gradle doesn't store the "compiled" resources in the same output directory as the compiled classes, Hibernate doesn't find the mapped entities.

Add this line to your gradle build, and it will probably be fine

sourceSets.main.output.resourcesDir = sourceSets.main.output.classesDir