原创 hibernate总结 收藏
对象关系映射:
Hibernate访问持久话类属性的策略:
在对象-关系映射文件中,<property>元素的access属性用于指定Hibernate访问持久化类的属性的方式:
Property:默认值,表明Hibernate通过相映的setXXX()和getXXX()方法来访问类的属性,可以更灵活的封装
持久化类,提高域模型的透明性.
field:表明Hibernate运用java反射机制直接访问类的属性,如果类没有为某个属性,如:name提供setName()
和getName()方法,就可以把属性设为field,使Hibernate能直接访问name属性.如:
<property name="name" access="field"/>,除了以上两种方法,还可以自定义持久化类的属性的访问方式,这
需要创建有个实现net.sf.hibernate.property.PropertyAccessor接口的类,然后把类的完整名字赋予<property>元素的access属性.
<property>元素的formula属性指定一个SQL表达式,该表达式可以引用表的字段,调用SQL函数或者包含子查询语句,如:LineItem类中有一个
unitPrice属性,而在表LINEITEMS表中没有对应的UNIT_PRICE字段,可以通过下面方式映射unitPrice属性L
<property name="unitPrice" formula="BASE_PRICE*QUANTITY"/>
用于控制insert和update语句的映射属性
<property>元素的insert属性:如果为false,在insert语句中不包含该字段,表明该字段永远不能被插入.
<property>元素的update属性:如果为false,在update语句中不包含该字段,表明该字段永远不能被更新.
<class>元素的mutable属性:如果为false,等于所有的<property>元素的update属性为false,表示整个实例不能被更新.
<property>元素的dynamic-insert属性:如果为true,表示当保存一个对象的时候,会动态生成insert语句,只有这个字段取值不为null,才会把
他包含到insert语句中.
<property>元素的update属性:如果为true,表示当更新一个对象的时候,会动态生成update语句,只有这个字段取值不为null,才会把
他包含到update语句中
<class>元素的dynamic-insert属性:如果为true,等于所有的<property>元素的dynamic-insert属性为true,表示当保存一个对象时,会动态生成insert
语句,insert语句中仅包含所有取值不为null的字段.
<class>元素的dynamic-update属性:如果为true,等于所有的<property>元素的dynamic-update属性为true,表示当更新一个对象时,会动态生成update
语update语句中仅包含所有取值不为null的字段.
创建命名策略:
实现Hibernate的NamingStrategy接口:
例如:
import net.sf.hibernate.cfg.NamingStrategy;
import not.sf.hibernate.util.StringHelper;
public classMyNamingStrategy implements NamingStrategy
{
public String classToTableName(String calssName)
{
///unqualify()是StringHelper类提供的实用方法,参数是一个类名,返回值是一个
不带包名的类名.
return StringHelper.unqualify(className).toUpperCase()+'s';
}
//类的属性名字映射为字段名字的方法
public String propertyToColumnName(String propertyName)
{
return propertyName.toUpperCase();
}
public String columnName(String columnName)
{
return columnName;
}
public String propertyToTableName(String className,String propertyName)
{
return classToTableName(className)+'_'+propertyToColumnName(propertyName);
}
}
为了让Hibernate采用以上的命名方案,需要在Hibernate初始化阶段设置Configuration对象的NamingStrategy属性:
如: Configuration config=new Configuration();
config.setnamingStratagy(new MyNamingStrategy());
设置命名Schema(通过配置方式来指定简单的命名策略)
如:<hibernate-mapping default-schema="QQ">
<class name="mypack.Customer" table="CUSTOMERS">
</class>
</hibernate-mapping>
那么Hibernate会把Customer类映射表成为QQ_CUSTOMERS
对象关系映射:
Hibernate访问持久话类属性的策略:
在对象-关系映射文件中,<property>元素的access属性用于指定Hibernate访问持久化类的属性的方式:
Property:默认值,表明Hibernate通过相映的setXXX()和getXXX()方法来访问类的属性,可以更灵活的封装
持久化类,提高域模型的透明性.
field:表明Hibernate运用java反射机制直接访问类的属性,如果类没有为某个属性,如:name提供setName()
和getName()方法,就可以把属性设为field,使Hibernate能直接访问name属性.如:
<property name="name" access="field"/>,除了以上两种方法,还可以自定义持久化类的属性的访问方式,这
需要创建有个实现net.sf.hibernate.property.PropertyAccessor接口的类,然后把类的完整名字赋予<property>元素的access属性.
<property>元素的formula属性指定一个SQL表达式,该表达式可以引用表的字段,调用SQL函数或者包含子查询语句,如:LineItem类中有一个
unitPrice属性,而在表LINEITEMS表中没有对应的UNIT_PRICE字段,可以通过下面方式映射unitPrice属性L
<property name="unitPrice" formula="BASE_PRICE*QUANTITY"/>
用于控制insert和update语句的映射属性
<property>元素的insert属性:如果为false,在insert语句中不包含该字段,表明该字段永远不能被插入.
<property>元素的update属性:如果为false,在update语句中不包含该字段,表明该字段永远不能被更新.
<class>元素的mutable属性:如果为false,等于所有的<property>元素的update属性为false,表示整个实例不能被更新.
<property>元素的dynamic-insert属性:如果为true,表示当保存一个对象的时候,会动态生成insert语句,只有这个字段取值不为null,才会把
他包含到insert语句中.
<property>元素的update属性:如果为true,表示当更新一个对象的时候,会动态生成update语句,只有这个字段取值不为null,才会把
他包含到update语句中
<class>元素的dynamic-insert属性:如果为true,等于所有的<property>元素的dynamic-insert属性为true,表示当保存一个对象时,会动态生成insert
语句,insert语句中仅包含所有取值不为null的字段.
<class>元素的dynamic-update属性:如果为true,等于所有的<property>元素的dynamic-update属性为true,表示当更新一个对象时,会动态生成update
语update语句中仅包含所有取值不为null的字段.
创建命名策略:
实现Hibernate的NamingStrategy接口:
例如:
import net.sf.hibernate.cfg.NamingStrategy;
import not.sf.hibernate.util.StringHelper;
public classMyNamingStrategy implements NamingStrategy
{
public String classToTableName(String calssName)
{
///unqualify()是StringHelper类提供的实用方法,参数是一个类名,返回值是一个
不带包名的类名.
return StringHelper.unqualify(className).toUpperCase()+'s';
}
//类的属性名字映射为字段名字的方法
public String propertyToColumnName(String propertyName)
{
return propertyName.toUpperCase();
}
public String columnName(String columnName)
{
return columnName;
}
public String propertyToTableName(String className,String propertyName)
{
return classToTableName(className)+'_'+propertyToColumnName(propertyName);
}
}
为了让Hibernate采用以上的命名方案,需要在Hibernate初始化阶段设置Configuration对象的NamingStrategy属性:
如: Configuration config=new Configuration();
config.setnamingStratagy(new MyNamingStrategy());
设置命名Schema(通过配置方式来指定简单的命名策略)
如:<hibernate-mapping default-schema="QQ">
<class name="mypack.Customer" table="CUSTOMERS">
</class>
</hibernate-mapping>
那么Hibernate会把Customer类映射表成为QQ_CUSTOMERS