<entity class="auction.model.User" access="FIELD">
<attributes>
...
<transient name="age"/>
</attributes>
</entity> 一个典型的Hibernate属性映射定义了一个POJO的属性名称、一个数据库列名和一个Hibernate类型的名称,并且它可能经常省略类型。因此,如果description是(Java)类型java.lang.String的一个属性,Hibernate就默认使用Hibernate类型string。<property name="description" column="DESCRIPTION type="string"/> <property name="description" column="DESCRIPTION"/>如果列名与属性名相同(忽略大小写),那么列名甚至可以省略。
@Basic(optional = false)
@Column(nullable = false)
public BigDecimal getInitialPrice { return initialPrice; } @Basic注解把属性标识为在Java对象级上不可选。第二个设置,列映射上的nullable = false,只负责NOT NULL(非空)数据库约束的生成。<entity class="auction.model.Item" access="PROPERTY">
<attributes>
<basic name="initialPrice" optional="false">
<column nullable="false"/>
</basic>
</attributes>
</entity>用于属性的注解永远都在访问方法中吗?@Column(name = "ITEM_DESCR")
private String description;
public String getDescription() { return description; } 这是JPA规范定义的默认行为。然而,Hibernate允许利用@org.hibernate.annotations.AccessType(<strategy>)注解灵活地定制访问策略:<property name="description"
column="DESCR"
access="field"/> 或者,可以用default-access属性给一个根<hibernate-mapping>元素内部的所有类映射设置访问策略。<property name="totalIncludingTax"
formula="TOTAL + TAX_RATE * TOTAL"
type="big_decimal"/> 这个给定的SQL公式在每次从数据库获取实体时求值(并且在任何其他时间不求值,因此如果其他的属性被修改,这个结果就可能过时)。属性没有列属性(或者子元素),并且永远不会出现SQL的INSERT或者UPDATE中,而只在SELECT中。公式可能指向数据库表的列,它们可以调用SQL函数,甚至包括SQL子查询。@org.hibernate.annotations.Formula("TOTAL + TAX_RATE * TOTAL")
public BigDecimal getTotalIncludingTax(){
return totalIncludingTax;
}下列示例使用一个关联的子查询来计算一件货品所有出价的平均值:<property
name="averageBidAmount"
type="big_decimal"
formula="(select AVG(b.AMOUNT) from
BID b where b.ITEM_ID = ITEM_ID"/>另一种特殊的属性依赖数据库生成的值。<property name="lastModified"
column="LAST_MODIFIED"
update="false"
insert="false"
generated="always"/> 标记为数据库生成的属性还必须是非可插入和非可更新的,用insert和update属性进行控制它们。如果两者都设置为false,属性的列就永远不会出现在INSERT或者UPDATE语句中——属性值是只读的。而且,通常不在类中给不可变的属性添加公有的设置方法(并切换到字段访问)。@Column(updatable = false, insertable = false)
@org.hibernate.annotations.Generated(
org.hibernate.annotations.GenerationTime.ALWAYS
)
private Date lastModified; 数据库生成的属性值的一个特殊情况是默认值。例如,你可能想要实现一种规则,即每件拍卖货品的成本至少为$1。首先,得把它作为INITIAL_PRICE列的默认值添加到数据库目录:create table ITEM(
...
INITIAL_PRICE number(10,2) default ‘1‘,
...
); 如果使用Hibernate的Schema导出工具hbm2ddl,则可以通过把default属性添加到属性映射来启用这项输出:<class name="Item" table="TBL_ITEM"
dynamic-insert="true" dynamic-update="true">
...
<property name="initialPrice" type="big_decimal">
<column name="INITIAL_PRICE" default="‘1‘" generated="insert"/>
</property>
</class> 注意,你还必须启用动态的插入并更新语句的生成,以便包含默认值的列不会被包括在每个语句中,如果它的值为null(否则将插入NULL,而不是默认值)。此外,已经被变成持久化但尚未清除到数据库,将不在对象属性上设置默认值。换句话说,你需要执行一个显式的清除:Item newItem = new Item(...); session.save(newItem); newItem.getInitialPrice(); //is null session.flush(); //Hibernate does a SELECT automatically newItem.getInitialPrice(); //is $1因为设置了generated="insert",Hibernate知道读取数据库生成的属性值立即需要一个额外的SELECT。
@Column(
name="INITIAL_PRICE",
columnDefinition="number(10,2) default ‘1‘")
@org.hibernate.annotations.Generated(
org.hibernate.annotations.GenerationTime.INSERT
)
private BigDecimal initialPrice; columnDefinition属性包括列DDL的完整属性,包含数据类型和所有约束。记住,一个实际上不可移植的SQL数据类型可能把注解映射绑定到一个特定的数据库管理系统。Hibernate实战_笔记25(细粒度的模型和映射),布布扣,bubuko.com
原文:http://blog.csdn.net/com185272358/article/details/21387165