使用 NHibernate/Hibernate 将实体类型转换为子类型

Posted

技术标签:

【中文标题】使用 NHibernate/Hibernate 将实体类型转换为子类型【英文标题】:Convert type of entity to subtype with NHibernate/Hibernate 【发布时间】:2010-12-09 15:00:30 【问题描述】:

请您帮我找出以下问题的更好解决方案... 我的域模型有一个层次结构:

class Document  
  Int Id; 
  String Title; 

class Agreement : Document  
  DateTime Signed; 

持久化策略是 Table-per-class。 IE。 2 个表格:“文档”(Id,...)和“协议”(Fk_document,...)

第一个操作是注册文件。目前我不知道文档的真实类型。所以我创建新文档并填写其属性“标题”。

一段时间后,我收到了更多信息。根据它,先前注册的文件实际上是在某个日期签署的协议。现在我可以填写协议的“已签署”属性。

但要做到这一点,有必要以某种方式将类型从文档转换为协议。我可以像这样进行 SQL 调用:

INSERT INTO AGREEMENTS (FK_DOCUMENT, SIGNED_DATE) VALUES ( 1111111, TO_DATE('01-01-2000') ) 

(其中 '1111111' 是 Hibernate 在第一次保存文档时分配给文档的 ID)

我相信这根本不是最好的方法!但是我找不到其他人... 谢谢!

(我想出了这个例子,实际用例比较困难,我不想妨碍这个问题。文档必须尽快保存)

【问题讨论】:

【参考方案1】:

当您需要“更改持久实体的类”时,这表明您并不想将其建模为类层次结构。相反,请使用组合。

【讨论】:

谢谢!总的来说,我同意你的看法。在未来的一个版本中,我将添加以模拟类别之类的东西。因此 Document 将包含一个像 AgreementCategory 这样的属性,其中包含协议的属性。这将是一种架构决策。但现在的问题是 - 如何通过 Nhibernate 方法“更改类”(如果可能的话)。 @barser:您必须求助于 SQL 或创建一个复制旧对象属性值的新实例。

以上是关于使用 NHibernate/Hibernate 将实体类型转换为子类型的主要内容,如果未能解决你的问题,请参考以下文章

Nhibernate/Hibernate、查找表和对象设计

Nhibernate/Hibernate、查找表和对象设计

配置NHibernate hibernate.cfg.xml文件以获得更多连接字符串

我可以将 Visual C++ 用于将使用 gcc 编译的作业吗?

R语言使用dplyr将特定的数据列移动到最前面使用dplyr将特定数据列移动到另一指定数据列的后面使用dplyr将特定数据列移动到另一指定数据列的前面

您将如何将 node.js 子进程与 discord.js 一起使用?