我是Hibernate的新手,似乎很难让Hibernate正确地将MySQL数据库(例如:https://launchpad.net/test-db/)反向工程为Java类。
在雇员数据库模式中,有几个表:
问题是,当我对表(下面的配置和reveng文件)进行逆向工程时,不是创建上面的4个Java类,而是Hibernate给了我6个带有额外类的Java类bolded:
据我所知,对于具有复合主键的表,Hibernate正在创建一个新的“ classnameID”类,该类包含两个复合键的唯一组合。相反,仅具有例如dept_no和与该特定部门相关联的emp_no的集合/列表的DeptEmp类就很棒。
关于如何让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>
谢谢!
此行为是由于在一个表中有多个列作为ID,这就是为什么Departments表没有附加的IDClass,而Salaries没有。
所以,您如何解决这个问题?在您的reveng文件中,为每个表设置唯一的ID。如果您未正确处理表中的所有主键,则可能会在代码中引起一些问题,请谨慎操作。
此外,您可以拥有这些额外的类,并将它们视为int或String,只需正确地初始化它们并在您的实体中进行设置即可。希望我在遇到这个问题时能对您有所帮助,这对我来说是很大的挑战。