【问题标题】:NetBeans > Hibernate Wizards > Create POJOs from database" (Derby) does not generate any relationship-mappings in hbm.xmlNetBeans > Hibernate Wizards > Create POJOs from database”(Derby)不会在 hbm.xml 中生成任何关系映射
【发布时间】:2021-05-30 18:10:45
【问题描述】:

我在 NetBeans IDE 11.3Hibernate ORM 5.4.31 中从 Derby 10.14.2.0 数据库生成 POJO强>。

它不会在hbm.xmlmany-to-one/one-to-one 等实体类中生成任何relationship-mappings

我将 Derby 示例项目 用于 mcve

我使用了 Derby 示例数据库中的两个表。

产品和采购订单

产品表在 PurchaseOrder 中被引用。

PurchaseOrderFOREIGN_KEY_PRODUCT_ID. 如下图所示。

hibernate.cfg

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.DerbyTenSevenDialect</property>
        <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
        <property name="hibernate.connection.url">jdbc:derby://localhost:1527/sample</property>
        <property name="hibernate.connection.username">app</property>
        <property name="hibernate.connection.password">app</property>
       
        <mapping resource="com/pojo/Product.hbm.xml"/>
        <mapping resource="com/pojo/PurchaseOrder.hbm.xml"/>
    </session-factory>
</hibernate-configuration>  

我也尝试定义休眠属性

<property name="hibernate.default_catalog">app</property>

<property name="hibernate.default_schema">app</property>  

但不,它没有帮助。

hibernate.reveng.xml

<hibernate-reverse-engineering>
  <schema-selection match-schema="APP"/>
  <table-filter match-name="PRODUCT"/>
  <table-filter match-name="PURCHASE_ORDER"/>
</hibernate-reverse-engineering>

PurchaseOrder.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.pojo.PurchaseOrder" table="PURCHASE_ORDER" schema="APP" optimistic-lock="version">
        <id name="orderNum" type="int">
            <column name="ORDER_NUM" />
            <generator class="assigned" />
        </id>
        <property name="customerId" type="int">
            <column name="CUSTOMER_ID" not-null="true" />
        </property>
        <property name="productId" type="int">
            <column name="PRODUCT_ID" not-null="true" />
        </property>
        <property name="quantity" type="java.lang.Short">
            <column name="QUANTITY" />
        </property>
        <property name="shippingCost" type="big_decimal">
            <column name="SHIPPING_COST" precision="12" />
        </property>
        <property name="salesDate" type="date">
            <column name="SALES_DATE" length="10" />
        </property>
        <property name="shippingDate" type="date">
            <column name="SHIPPING_DATE" length="10" />
        </property>
        <property name="freightCompany" type="string">
            <column name="FREIGHT_COMPANY" length="30" />
        </property>
    </class>
</hibernate-mapping>  

在上面的 PurchaseOrder.hbm.xml 文件中,应该生成relationship mapping,但您可以看到它缺少

为什么relationship mapping即使是Derby的示例数据库也不生成?

使用 MySQL 可以正常工作。

Hibernate 不能正确支持 Derby 吗?
什么是解决方案?

【问题讨论】:

  • 提供不工作的特定表的完整详细信息,以便其他人可以尝试复制您的问题。就目前而言,您的问题无法回答,因为没有足够的信息。
  • @skomisa 非常感谢。我会提供的。

标签: hibernate netbeans derby pojo hbmxml


【解决方案1】:

简短的回答

你已经接近解决它了。简短的回答是:只需将此行添加到您的 hibernate.cfg.xml 配置文件(添加空目录):

<property name="hibernate.default_catalog"/>

我的hibernate.cfg.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property>
    <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
    <property name="hibernate.connection.url">jdbc:derby://localhost:1527/sample</property>
    <property name="hibernate.connection.username">app</property>
    <property name="hibernate.connection.password">app</property>
    <property name="hibernate.default_catalog"/>
  </session-factory>
</hibernate-configuration>

使用此配置,NetBeans Hibernate POJO 向导可以很好地生成关系映射。查看生成的PurchaseOrder.hbm.xml文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 13.06.2021 12:06:13 by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="pojo.PurchaseOrder" table="PURCHASE_ORDER" schema="APP" optimistic-lock="version">
        <id name="orderNum" type="int">
            <column name="ORDER_NUM" />
            <generator class="assigned" />
        </id>
        <many-to-one name="customer" class="pojo.Customer" fetch="select">
            <column name="CUSTOMER_ID" not-null="true" />
        </many-to-one>
        <many-to-one name="product" class="pojo.Product" fetch="select">
            <column name="PRODUCT_ID" not-null="true" />
        </many-to-one>
        <property name="quantity" type="java.lang.Short">
            <column name="QUANTITY" />
        </property>
        <property name="shippingCost" type="big_decimal">
            <column name="SHIPPING_COST" precision="12" />
        </property>
        <property name="salesDate" type="date">
            <column name="SALES_DATE" length="10" />
        </property>
        <property name="shippingDate" type="date">
            <column name="SHIPPING_DATE" length="10" />
        </property>
        <property name="freightCompany" type="string">
            <column name="FREIGHT_COMPANY" length="30" />
        </property>
    </class>
</hibernate-mapping>

长答案

为了澄清,NetBeans 11.3 POJO 向导使用以下版本的休眠:

NetBeans 向导使用这些库从数据库生成 POJO。基本工作流程是:

  1. 从数据库中获取所有表,使用方法getTables DatabaseMetaData
  2. 创建一个包含所有表的完全限定名称的列表。完全限定名称是[catalog].[schema].[table] 形式的表名称。 Derby 数据库为目录参数返回一个空字符串(不是 null 而是 empty )。 Hibernate 很好地处理了它,但是我们可以看到不同的数据库在这里表现不同。正如您在此处看到的,甚至还有关于它的 comment
  3. 在第 2 步之后,我们有一个包含所有表的 Map 集合,其中包含 APP.CUSTOMER、APP.PRODUCT 等键。到目前为止,一切都很好。
  4. Hibernate 使用getExportedKeys 方法获取特定表的所有外键,例如,APP.CUSTOMER。
  5. Hibernate 工具尝试以 [catalog].[schema].[table] 的形式再次形成一个表的完全限定名称,但这次不太好,它以表名 .APP.CUSTOMER 结束(请参阅应用程序前的点)。见here。限定方法检查 catalog!=nullgetExportedKeys 将其作为空字符串返回,而不是 null。
  6. Hibernate 工具尝试使用在步骤 3 中创建的 Map 从外键映射表,但失败(因为点)。

解决方法有效,因为我们对 Hibernate 说目录不是空的而是空的。看到这个lines

结论

所以 Hibernate 不能与 derby 一起工作的原因是 derby JDBC 客户端在返回有关外键的信息时表现不同。它为目录参数返回一个空字符串,但 MySQL 显然返回 null。

hibernate orm 框架在解析有关表的信息时对这种情况进行了特殊处理,但在使用外键时缺少它。所以我想它可以被认为是 Hibernate tools 4.3.1 中的一个错误

【讨论】:

  • 非常感谢。由于没有人回答我的问题,我使用注释解决了问题。我试过&lt;property name="hibernate.default_catalog"&gt;app&lt;/property&gt; 除非您回答使用空目录属性,否则我永远不会知道。太感谢了。玩得开心。
猜你喜欢
  • 1970-01-01
  • 2010-12-27
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多