当前位置: 首页 > 知识库问答 >
问题:

从gradle呼叫hbm2ddl

景恩
2023-03-14

是否有一个gradle插件或任何其他方法调用hiberNate工具hbm2ddl任务来从注释的类生成数据库模式,而不必列出一些配置文件中的所有实体(@Entity),但在类路径中发现它们?

最好是针对Hibernate5,但Hibernate4也可以。

共有1个答案

谭修然
2023-03-14

我最终通过移动持久性实现了这一点。xml文件。

在我的场景中,我有一些库实体和一些应用程序实体,我想为它们生成一个模式。显然,我需要列出持久化中的库实体。xml,这很好,因为它们不会经常更改,但是为了从类路径中提取应用程序实体,而不将它们列在持久性文件中,我必须确保类和持久性都是可用的。xml文件是由同一个类加载器加载的(我猜)。

这就是有效的方法。

图书馆实体:MyCustomer、MyInvoice

应用实体:MyBook, MyBooking

/src/main/resources/META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<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_2_0.xsd"
             version="2.0">

   <persistence-unit name="defaultPersistenceUnit">
        <!-- List the library classes only -->
        <class>net.mylibrary.entity.MyCustomer</class>
        <class>net.mylibrary.entity.MyInvoice</class>

      <properties>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.username" value="myusr"/>
            <property name="hibernate.connection.password" value="mypwd"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost/mydb"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
      </properties>
   </persistence-unit>
</persistence>

build.gradle:

apply plugin: 'war'
apply plugin: 'eclipse-wtp'

repositories {
    jcenter()
    mavenLocal()
}

dependencies {
    compile ... my project dependencies ...
}

configurations {
    hibtools
}

dependencies {
    hibtools 'net.mylibrary:MyEntities:1.0' // Library for MyCustomer and MyInvoice
    hibtools 'org.hibernate:hibernate-tools:4.+',
        'mysql:mysql-connector-java:5.+'
    hibtools files("$buildDir/classes/main") // MyBook and MyBooking
}

task createSchema(dependsOn: ['build', 'copyPersistenceUnit']) << {     
    ant.taskdef(name: 'hibernatetool',
            classname: 'org.hibernate.tool.ant.HibernateToolTask',
            classpath: configurations.hibtools.asPath)
    ant.hibernatetool(destdir: 'schema') {
        ant.jpaconfiguration(persistenceunit: 'defaultPersistenceUnit')
        ant.hbm2ddl(drop: 'false', export: 'false', outputfilename: 'mydb.sql')
    }
}

task copyPersistenceUnit(type: Copy) {
    from "$buildDir/resources/main/META-INF/persistence.xml"
    into "$buildDir/classes/main/META-INF/"
}

结果是一个包含MyCustomer、MyInvoice、MyBook、MyBooking表的ddl,即使MyBook和MyBooking没有在任何地方列出,也可以在不接触配置的情况下添加或删除。

这里的诀窍是复制持久性。从resources文件夹到classes文件夹的xml文件。如果不这样做,为了找到它,您需要使用以下内容将资源路径添加到hibtools配置中:

hibtools files(["$buildDir/resources/main", "$buildDir/classes/main"])

但是这样做将防止您的应用程序实体被发现。

这适用于Hibernate 4。使用当前的Hibernate 5 alpha工具会生成一个空的ddl文件。

 类似资料:
  • Gradle 2.13中的以下工作: 在Gradle 3.0中,我收到错误: 方法没有签名:静态组织。格拉德尔。util。ConfigureUtil。configure()适用于参数类型:(build\u dke3xcnofl8fbuvcpvgwyc2r5$\u run\u closure12$\u closure38,com.eriwen.gradle.css.source.internal.D

  • 我在调用我的onLeScan时遇到问题。我在开始扫描中放置了一个标签,每次都会被调用。出于某种原因,我的onLeScan永远不会被调用。有人看到我所做的有问题吗?onLeScan应该在开始扫描后立即调用,对吗? 编辑更改了我的onLeScan函数。仍然不起作用,但我认为我正在走向正确的道路。DeviceBeacon是一个只包含方法的类:getName()、getSignal()和getAddres

  • 1、接口声明 如果您希望在自己的CRM系统嵌入呼叫中心能力,需要对接智齿呼叫中心能力,在对接前请您阅读如下对接流程,以便您更好的完成对接。如果只对接基本呼叫能力,预计对接及调试过程1周左右即可完成。 第一步:获取第三方用户接口调用唯一凭证 请联系您的售后经理,获取您企业的如下信息: 1、companyid(企业id) 2、appid(第三方用户接口调用唯一凭证id) 3、app_key(第三方用户

  • 我是RXJava的新手。在一个场景中,我希望调用第一个登录webservice(),如果成功,则希望调用另一个webservice()以获取用户信息。

  • 我举了以下例子: 我为Profile类创建了复杂的模型管理器,并且我构建了一个视图来列出大量的人。我试图计算数据库中的所有内容,所以我想从PersonQuerySet调用配置文件管理器。 为此,我需要做如下工作: 然后我应该能够从SQL检索person.profile.computed_revenue,函数“with_computed_revenue”是注释computed_revenue的Pro