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

时间:2014-09-29 17:49:43

标签: java mysql eclipse hibernate reverse-engineering

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

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

  • 员工(主键emp_no)
  • department(主键dept_no)
  • 工资(复合键emp_no和from_date)
  • dept_emp(复合键dept_no和emp_no)

问题在于,当我对表进行反向工程时(下面的配置文件和浏览文件),而不是创建上面的4个java类,Hibernate给了我6个Java类,其中有额外的粗体:< / p>

  • 员工
  • 部门
  • 薪金
  • SalariesId
  • 的deptemp
  • 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 个答案:

答案 0 :(得分:0)

此行为是由于在一个表中有多个列作为ID所致,因此,Departments表没有附加的IDClass,而Salaries没有。

那么,您如何解决这个问题?在您的reveng文件中,为每个表设置唯一的ID。如果您未正确处理表中的所有主键,则可能会在代码中引起一些问题,因此请务必谨慎。

此外,您还可以拥有这些额外的类,并将它们视为int或String,只需正确地对其进行初始化并在您的实体中进行设置即可。希望我在遇到这个问题时能对您有所帮助,这对我来说是很大的挑战。