创建映射文件时,是否将属性映射到字段或属性:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Foo" namespace="Foo.Bar" >
<class name="Foo" table="FOOS" batch-size="100">
[...]
<property name="FooProperty1" access="field.camelcase" column="FOO_1" type="string" length="50" />
<property name="FooProperty2" column="FOO_2" type="string" length="50" />
[...]
</class>
</hibernate-mapping>
当然,请解释原因:)
通常,我映射到属性,但映射到字段可以在属性的getter / setter中放置一些“逻辑”。
映射到字段是否“糟糕”?有最好的做法吗?
答案 0 :(得分:5)
我映射到属性。如果我觉得有必要,我将SETTER映射到一个字段。 (通常通过“access = field.camelcase”之类的东西)。
这让我看起来很漂亮,例如“来自FirstName ='John'的人,而不是像”来自于firstName / _firstName的人“这样的东西,并且在为我的实体保湿时也避免使用setter逻辑。
答案 1 :(得分:2)
属性在您需要对数据执行时,因为它进入和退出持久存储时也很有用。通常应该避免这种情况,但是一些罕见的商业案例或遗留支持有时会要求这样做。
(请记住,如果你在使用getter返回时以某种方式转换数据,NHibernate将(默认情况下)使用getter的返回并将其保存回数据库当会话被刷新/关闭时。确保这是你想要的。)
答案 2 :(得分:1)
我映射到属性,我没有遇到过我会映射到某个字段的情况......当我有我扩充我的B.O.为需求而设计。我认为它允许更好的架构。
答案 3 :(得分:1)
我映射到属性,因为我使用自动属性。
除了集合(例如set
s。那些我映射到字段(access="field.camelcase-underscore"
)的那些因为我没有暴露它们的公共属性,而是方法。
答案 4 :(得分:1)
空对象
如果要在类中实现null object pattern,则映射到字段会很有用。因为映射到Properties时无法轻松执行此操作。您最终必须在数据库中存储虚假对象。
<强> HQL 强>
我不确定使用HQL查询时,如果使用字段访问方法,则必须更改属性名称。即如果你有<property name="FirstName" access="field.camelcase" />
我认为你仍然可以写"From Person where FirstName = :name";
,因为它仍会使用属性名称。
可以找到关于字段策略和Null对象的进一步讨论here。
<强>性能强>
关于John Chapman's blog上字段与财产的表现 看起来中小型结果集的性能没有太大问题。
总之,根据场景,每种方法都有一些特殊的好处(字段访问允许只读getter,不需要setter,属性访问工作,当你的poco不需要特殊的东西,似乎是事实上的方法。等)
答案 5 :(得分:0)
我倾向于同意上面的答案。通常,映射到几乎所有内容的属性,然后映射到集合设置器的字段 你想要映射到字段的唯一其他地方就是你有什么东西:
public class AuditableEntity
{
/*...*/
DateTime creationDate = DateTime.Now;
/*...*/
public DateTime CreationDate { get { return creationDate; } }
}
答案 6 :(得分:0)
我直接映射到字段,这允许我使用属性设置器来跟踪属性的脏状态。