NHibernate:映射到字段或者属性?
创建映射文件时,是否将属性映射到字段或者属性:
<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中加入一些"逻辑"。
映射到字段是否"不好"?有最佳实践吗?
解决方案
我映射到属性,没有遇到映射到字段的情况……当我拥有时,我会增加我的B.O。根据需要进行设计。我认为它允许更好的体系结构。
我映射到属性。如果我认为有必要,可以将SETTER映射到一个字段。 (通常通过" access = field.camelcase"之类的方式)。
这使我拥有美观的查询,例如"来自FirstName ='John'的人",而不是" From FirstName / _firstName的人",并且在给实体充水时也避免了设置逻辑。
我映射到属性,因为我使用自动属性。
除了集合(例如set
s。我映射到字段(" access =" field.camelcase-underscore"`)之外的集合),因为我没有公开它们的公共属性,而是方法。
如果我们需要对数据进出持久性存储进行一些时髦的处理,则属性也很有用。通常应该避免这种情况,但是有时需要一些罕见的业务案例或者传统支持。
我倾向于同意以上答案。通常,映射到几乎所有内容的属性,然后映射到集合设置器的字段。
我们想要映射到字段的唯一其他地方是在我们拥有某些东西时:
public class AuditableEntity { /*...*/ DateTime creationDate = DateTime.Now; /*...*/ public DateTime CreationDate { get { return creationDate; } } }
空对象
如果我们要在类中实现空对象模式,则映射到字段会很有用。因为映射到属性时无法(轻松)执行此操作。我们最终不得不在数据库中存储伪造的对象。
高品质
我不确定使用HQL查询是否必须使用字段访问方法来更改属性名称。即,如果我们具有<property name =" FirstName" access =" field.camelcase" />,我想我们仍然可以编写" From From where where FirstName =:name";
,因为它仍将使用属性名称。
有关场策略和Null对象的更多讨论可以在这里找到。
表现
关于约翰·查普曼(John Chapman)博客上的领域vs财产表现
看起来,中小型结果集的性能没有太大问题。
总而言之,每种方法都有一些优点,具体取决于情况(现场访问允许只读getter,不需要setter,当poco不需要特别要求且似乎是事实上的方法时,属性访问有效)
我直接映射到字段,这使我可以使用属性设置器来跟踪属性的脏状态。