架构:
人员和帐户记录将写入数据库。现在,我必须将两者联系在一起。最佳做法?
要点: 至于答案,唯一的方法是通过特殊代码链接帐户与人匹配。 Hibernate无法做到这一点。
乍一看,这似乎是一件容易的事,但让我向你解释一下情况:
我有来自帐户和个人的CSV文件的数据副本。 Person - Account a related via a 1:n relationship.
我希望在hibernate的帮助下将这些实体导入mysql
数据库。问题是Person和Account之间的外键关系只在运行时才知道。这意味着,我不能只写:
// …
@ManyToOne
@JoinColumn(name = "person_id")
public Person getPerson() {
return person;
}
// …
帐户记录由不同的属性字段组成,取决于帐户的类型(SAP帐户具有与AD帐户不同的属性)。
ADSAccount
和Person之间的关联是通过属性ADSAccount.SAMAccountName
和Person.CentralAccount
完成的。对于SAP帐户,连接属性为SAPAccount.accn
t和Person.CentralSAPAccount
。这意味着,连接属性因帐户类型和帐户类型而异。这说,我有一个大问题。如何在编译时告诉hibernate如何连接Account和Person,即如何定义外键关系?
更新
我不需要在编译时了解属性字段。 Person
和Account
通过与Attribut
实体的多对多关系进行关联。这样我就可以在运行时动态添加包括值(存储在连接表中)的属性!
但接线Person
和Account
的问题仍然存在。连接属性仅在运行时已知,而hibernate在编译时需要此信息。
更新(10:25 22.02.2014): Roman指出:“导入过程中需要特殊处理,因为导入代码需要根据Account的业务键找到person_id。”这正是我可能需要帮助的实际问题。强力方法是循环所有帐户并为匹配的人查找每个帐户=“帐户金额”(加载到列表中)x“人员金额”(每个人的数据库命中)操作。这导致了我的程序中的堆栈溢出。
这种特殊处理怎么样?
答案 0 :(得分:1)
您基本上希望以某种通用形式表示关联。而泛化的本质是您希望将属性名称用于将对象链接为动态。
Hibernate不支持此功能。
在我看来,你的问题的主要来源是应该使用的帐户和字段的类型在运行时是已知的,但这很容易通过使用代理键来克服。
。如果是这种情况,则仅将关联基于Account
的业务键,而不是Person
的代理键。这可以直接在hibernate映射中表示,使用帐户表中的FK或使用单独的表。这允许在不更改模型的情况下添加新类型的帐户(如果需要,则只需创建带有每个帐户类型的子类的抽象Account
)。
导入过程中将需要特殊处理,因为导入代码需要根据Account
的业务键找到person_id。