<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