如何使用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逆向工程排除多对一关系?的主要内容,如果未能解决你的问题,请参考以下文章