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

Posted

技术标签:

【中文标题】如何使用hibernate逆向工程排除多对一关系?【英文标题】:How to exclude many-to-one relationship using hibernate reverse engineering? 【发布时间】:2017-07-20 22:25:06 【问题描述】:

我有两个表用户和患者。患者中有一个用户 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】:

我已经使用个性化策略解决了这个问题。为此,我们必须遵循以下步骤: 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-调整配置“休眠代码生成”以使用自定义策略:

很遗憾,排除注释似乎不起作用。

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

【讨论】:

以上是关于如何使用hibernate逆向工程排除多对一关系?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate中一对多和多对一关系

JPA/Hibernate - 多态多对一关系设计

如何正确映射与@IdClass 的多对一关系?

删除多对一关系 - Hibernate [重复]

关联映射级联操作关系维护 ---- Hibernate之一对多|多对一关系

休眠:多对一关系失败