ProductReleaseID
SubProductAllowable
ProductID
此外,formula 也能协助从基于当前记录的特定值向其它表检索数据。例如:
这将由助于从 currency 表检索 currency name。正如你所看到的,这样直接映射可消除许多转换编码。 map-key formula 允许 map-key 持有任何可能的值。下列范例(图 3),我们想让 Role_roleID 成为对象模型的 map-key(图 4)。 图 3. 用户角色数据 schema 图 4. 用户角色对象模型 在前面的数据 schema 中,User 和 Role 由 User_has_Role 通过 many-to-many 关系关联调用。为了获取某个 User 所有的指派角色,我们进行如下映射:
Role_RoleID 通常用于连接 many-to-many 元素的栏位值。Hibernate 通常不允许 Role_RoleID 出现在 map-key 和 many-to-many 的栏位属性中。但是有了 formula,Role_RoleID 也能用于 map-key。 element、map-key-many-to-many 以及其他 element 和 property 类似,能从任何有效的 formula 表达式赋予评估值。 map-key-many-to-many 中 formula 的用法类似于 map-key。但是,map-key-many-to-many 通常用于三重关系,map key 是一个被自己参考的对象,而不是被参考的属性。 那么,到底哪些情况下 formula 不支持呢?有些数据库(例如 Oracle 7)就不支持嵌入式 select 语句(也就是说一条 select SQL 内嵌在另外一条 select SQL 语句中),这种情况 formula 就不支持评估结果。因此,你应该首先检查嵌入式 select SQL 语句是否被支持。 一旦 Hibernate 的映射拿 formula 表达式作为 select SQL 选取的一部分,请确认数据库 SQL 方言是否允许使用 formula,尽管这样将降低代码轻便性。 范畴 2:formula 用于连接
many-to-one 另一个普遍的场景是真实世界的数据模型是所有者关系映射,这意味着映射是不同于 one-to-one、one-to-many 以及 many-to-many 关系的,formula 是提供所有者关系管理元素中的一个。图 5 展示了某公司可有多个联系人,但是其中只有一个为默认联系人的范例。一个公司有多个联系人是典型的 one-to-many 关系。但是,为了标识默认联系人,ContactPerson 表使用了 defaultFlag 参数(1 是 yes, 0是 no)。 图 5. 用户角色数据 schema 图 6. 用户角色对象模型 为了说明对象模型(图 6)中默认联系人关系,我们使用如下映射文件:
如上,我们把 companyID 和 defaultFlag 组织到名为 defaultContactPerson 的 properties 元素中,做为 Person 表的 unique key。Company 类中的 many-to-one 元素连接 Person 表的 defaultContactPerson properties 元素。输出的 SQL 像这样: select c.id, p.id from Company c, Person p where p.companyID=c.id and p.defaultFlag=1 one-to-one Hibernate 中,one-to-one 主要用于两张表共享同一主键的情况。对于外键关联,我们通常使用 many-to-one 来代替。但是,有了 formula,one-to-one 可以通过外键连接表。上面的 many-to-one 范例可以通过 one-to-one 来映射:
many-to-many formula 用于当 many-to-many 元素为关系表和实体表连接的特殊关系,尽管通常没有必要这样用。 总结
文章范例展示了大部分 formula 的适用情景。当需要 formula 评估值时,formula 表达式将出现在 产生的 SQL 语句的 select 部分。当 formula 用于连接时,它出现在产生的 SQL 语句的 where 部分。此外,formula 表达式可用于任何 SQL 方言,只要目标数据库支持。最后,formula 可协助完成从数据模型到对象模型的无代码细粒度映射。 请注意!引用、转贴本文应注明原译者:Rosen Jiang 以及出处:http://www.blogjava.net/rosen