ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 5.1.9\. property `&lt;property&gt;`元素为类定义了一个持久化的,JavaBean风格的属性。 ``` <property name="propertyName" column="column_name" type="typename" update="true|false" insert="true|false" formula="arbitrary SQL expression" access="field|property|ClassName" lazy="true|false" unique="true|false" not-null="true|false" optimistic-lock="true|false" generated="never|insert|always" node="element-name|@attribute-name|element/@attribute|." index="index_name" unique_key="unique_key_id" length="L" precision="P" scale="S" /> ``` | ![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png) | `name`: 属性的名字,以小写字母开头。 | |:--- |:--- | | ![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png) | `column` (可选 - 默认为属性名字): 对应的数据库字段名。 也可以通过嵌套的`&lt;column&gt;`元素指定。 | | ![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png) | `type` (可选): 一个Hibernate类型的名字。 | | ![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png) | `update, insert` (可选 - 默认为 `true`) : 表明用于`UPDATE` 和/或 `INSERT` 的SQL语句中是否包含这个被映射了的字段。这二者如果都设置为`false` 则表明这是一个“外源性(derived)”的属性,它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成。 | | ![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png) | `formula` (可选): 一个SQL表达式,定义了这个_计算 (computed)_ 属性的值。计算属性没有和它对应的数据库字段。 | | ![6](https://box.kancloud.cn/2016-01-06_568cdb4f32753.png) | `access` (可选 - 默认值为 `property`): Hibernate用来访问属性值的策略。 | | ![7](https://box.kancloud.cn/2016-01-06_568cdb4f41fcc.png) | `lazy` (可选 - 默认为 `false`): 指定 指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)( 需要运行时字节码增强)。 | | ![8](https://box.kancloud.cn/2016-01-06_568cdb4f5948a.png) | `unique` (可选): 使用DDL为该字段添加唯一的约束。 同样,允许它作为`property-ref`引用的目标。 | | ![9](https://box.kancloud.cn/2016-01-06_568cdb4f68749.png) | `not-null` (可选): 使用DDL为该字段添加可否为空(nullability)的约束。 | | ![10](https://box.kancloud.cn/2016-01-06_568cdb4f83cf0.png) | `optimistic-lock` (可选 - 默认为 `true`): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。 | | ![11](https://box.kancloud.cn/2016-01-06_568cdb4f902e3.png) | `generated` (可选 - 默认为 `never`): 表明此属性值是否实际上是由数据库生成的。请参阅[第 5.6 节 “数据库生成属性(Generated Properties)”](../Text/pr01_split_000.html "5.6\. 数据库生成属性(Generated Properties)")的讨论。 | _typename_可以是如下几种: 1. Hibernate基本类型名(比如:`integer, string, character,date, timestamp, float, binary, serializable, object, blob`)。 2. 一个Java类的名字,这个类属于一种默认基础类型 (比如: `int, float,char, java.lang.String, java.util.Date, java.lang.Integer, java.sql.Clob`)。 3. 一个可以序列化的Java类的名字。 4. 一个自定义类型的类的名字。(比如: `com.illflow.type.MyCustomType`)。 如果你没有指定类型,Hibernarte会使用反射来得到这个名字的属性,以此来猜测正确的Hibernate类型。 Hibernate会按照规则2,3,4的顺序对属性读取器(getter方法)的返回类进行解释。然而,这还不够。 在某些情况下你仍然需要`type`属性。(比如,为了区别`Hibernate.DATE` 和`Hibernate.TIMESTAMP`,或者为了指定一个自定义类型。) `access`属性用来让你控制Hibernate如何在运行时访问属性。在默认情况下, Hibernate会使用属性的get/set方法对(pair)。如果你指明`access="field"`, Hibernate会忽略get/set方法对,直接使用反射来访问成员变量。你也可以指定你自己的策略, 这就需要你自己实现`org.hibernate.property.PropertyAccessor`接口, 再在access中设置你自定义策略类的名字。 衍生属性(derive propertie)是一个特别强大的特征。这些属性应该定义为只读,属性值在装载时计算生成。 你用一个SQL表达式生成计算的结果,它会在这个实例转载时翻译成一个SQL查询的`SELECT` 子查询语句。 ``` <property name="totalPrice" formula="( SELECT SUM (li.quantity*p.price) FROM LineItem li, Product p WHERE li.productId = p.productId AND li.customerId = customerId AND li.orderNumber = orderNumber )"/> ``` 注意,你可以使用实体自己的表,而不用为这个特别的列定义别名( 上面例子中的`customerId`)。同时注意,如果你不喜欢使用属性, 你可以使用嵌套的`&lt;formula&gt;`映射元素。