如何使用hibernate逆向工程排除多对一关系?

时间:2017-03-01 14:28:54

标签: java mysql hibernate reverse-engineering

我有两个表用户和患者。患者有一个用户ID,即user_id F.K到user.id。

当我使用逆向工程创建模型类时,在用户模型中它创建了Set,但我只需要Patient。我的商业模式说用户与用户之间的一对一关系。患者

那么有办法吗?

下面是表格架构。

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,     
  PRIMARY KEY (`id`),
  UNIQUE KEY `Unique_Email_Id` (`user_email`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci



CREATE TABLE `patient` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `PATIENT_EMAIL_ID_UNIQUE_ID` (`email_id`),
  UNIQUE KEY `UNIQUE_USER_ID` (`user_id`),
  CONSTRAINT `User_Id_Foreign_Key_To_Patient_Id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

hibernate.reveng.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >

<hibernate-reverse-engineering>
    <type-mapping>
        <sql-type jdbc-type="BIT" hibernate-type="int"></sql-type>
    </type-mapping> 
    <table-filter match-name="user">
    <table-filter match-name="patient"></table-filter>
    <table name="patient">          
        <foreign-key constraint-name="Unique_user_Id">          
            <many-to-one exclude="true"/>
        </foreign-key>
    </table>
</hibernate-reverse-engineering>

1 个答案:

答案 0 :(得分:0)

我已经使用个性化策略解决了这个问题。为此,我们必须遵循以下步骤: 1-对Maven的新依赖:

<!-- Hibernate tools para estrategia presonalizada -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-tools</artifactId>
    <version>5.3.7.Final</version>
</dependency>

2-创建自DelegatingReverseEngineeringStrategy扩展的自定义策略类(CustomReverseEngineeringStrategy)。

package com.xxx.model.strategy;

import java.util.List;

import org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.TableIdentifier;

public class CustomReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy {
...
}

3-覆盖excludeForeignKeyAsManytoOne方法,在该方法中,我们将基于一个标准设置一个标准,该标准将指示必须考虑哪些多对一关系,而哪些则不考虑:

@Override
public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List<?> fromColumns, TableIdentifier referencedTable, List<?> referencedColumns) {
    return referencedTable.getName().startsWith(EXCLUDED_REFERED_TABLE_PREFIX);
}

4-使用自定义策略调整配置“休眠代码生成”: enter image description here

不幸的是,排除注释似乎不起作用。

我希望此解决方案有用。使用个性化策略可以实现很多事情,因为我们可以覆盖控制实体反向生成的几乎所有方面的多种方法。