Hibernate 逆向工程复合键创建额外的 ID 类

Posted

技术标签:

【中文标题】Hibernate 逆向工程复合键创建额外的 ID 类【英文标题】:Hibernate Reverse Engineering Composite Key Creates Extra ID Class 【发布时间】:2014-11-24 04:42:46 【问题描述】:

我是 Hibernate 的新手,我似乎无法让 Hibernate 正确地将 mysql 数据库(例如:https://launchpad.net/test-db/)逆向工程为 Java 类。

在员工数据库架构中有几个表:

员工(主键emp_no) 部门(主键 dept_no) 工资(复合键 emp_no 和 from_date) dept_emp(复合键 dept_no 和 emp_no)

问题是当我对表格进行逆向工程时(下面的 config 和 reveng 文件),Hibernate 没有创建上面的 4 个 Java 类,而是给了我 6 个带有额外的 Java 类粗体

员工 部门 工资 SalariesId 部门员工 DeptEmpId

据我所知,对于具有复合主键的表,Hibernate 正在创建一个新的 "classnameID" 类,其中包含两个复合键的唯一组合。相反,如果只有 DeptEmp 类具有一个 dept_no 和一个与该特定部门相关联的 emp_no 的集合/列表,那就太棒了。

有什么想法可以让 Hibernate 不这样做吗?我在 .reveng 文件中尝试了很多东西,但似乎没有任何效果。

逆向工程文件:

<hibernate-reverse-engineering>
   <table-filter match-catalog="employees" match-name="departments" />
   <table-filter match-catalog="employees" match-name="dept_emp" />
   <table-filter match-catalog="employees" match-name="employees" />
   <table-filter match-catalog="employees" match-name="salaries" />

   <table schema="employees" name="departments">
      <primary-key>
         <key-column name="dept_no" />
      </primary-key>
   </table>   
   <table schema="employees" name="employees">
      <primary-key>
         <key-column name="emp_no" />
      </primary-key>
   </table>
   <table schema="employees" name="salaries">
      <primary-key>
         <key-column name="emp_no" />
         <key-column name="from_date" />
      </primary-key>
   </table>
   <table schema="employees" name="dept_emp">
      <primary-key>
         <key-column name="emp_no" />
         <key-column name="dept_no" />
      </primary-key>
   </table>
</hibernate-reverse-engineering>

配置文件:

<?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.connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/employees</property>
      <property name="hibernate.connection.username">****</property>
      <property name="hibernate.connection.password">****</property>
      <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
      <property name="connection.pool_size">20</property>
      <property name="current_session_context_class">thread</property>
      <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
      <property name="show_sql">true</property>
      <property name="format_sql">true</property>
      <property name="use_sql_comments">true</property>
    </session-factory>
</hibernate-configuration>

谢谢!

【问题讨论】:

你成功了吗? 问题依然存在。有人有想法吗? 【参考方案1】:

这种行为是由于单个表中有多个列作为 ID,这就是 Departments 表没有附加 IDClass 而 Salaries 有的原因。

那么,你如何解决这个问题?在您的 reveng 文件中,为每个表设置一个唯一 ID。如果您没有正确处理表中的所有主键,这可能会导致您的代码出现一些问题,因此请务必小心。

您也可以拥有这些额外的类并将它们视为 int 或 String,您只需正确初始化它们并将它们设置在您的实体中。希望我能帮助你,因为我遇到了这个问题,这对我来说非常困难。

【讨论】:

以上是关于Hibernate 逆向工程复合键创建额外的 ID 类的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot with hibernate:创建复合键和多对多关系

如何使用主键作为JPA和Hibernate的外键引用?

hibernate 复合主键映射

在复合键和 @ManyToOne JoinColumns 之间共享列

JPA/Hibernate 和复合键

Spring Data JPA - 为三个表创建 @Composite 键