Hibernate的杂七杂八

Hibernate的动态化
  hibernate的应用中一般总是将entity映射为强类型的java类,这为程序操纵带来很多便利,同时可以将大量动态过程隐蔽在对象包络之下。映射为java类的一个主要问题在于无法在程序运行时刻对于程序进行修改,而数据结构的局部修改几乎是无法避免的。hibernate3本身支持动态数据模型,它允许我们把entity映射为Map数据类型, 当数据结构发生变化的时候, 只需要修改hbm文件即可改变映射模型,而不需要修改java实体类代码.
    在hbm定义文件中,如果我们不指定name属性,而是指定entity-name属性,则我们可以将entity映射为Map, 而不是一个java实体类.
  <class
    entity-name="test.DynamicEntity"
    table="DYNAMIC_ENTITY"
  >...</class>
  此外, 也可以选择将部分字段动态映射到Map
  <class ...>
    <dynamic-component name="dynamicAttributes">
      <property name="foo" column="FOO"/>
      <property name="bar" column="BAR"/>
    </dynamic-component>
  </class>
在HQL语句中可以直接使用o.dynamicAttributes.foo来访问foo属性,所有操作与普通属性相同。

使用公式的细节
使用公式的映射文件写法
可以使用函数,也可以使用SQL
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="domain.Users" table="users" catalog="blogs">
        <id name="uid" type="java.lang.Integer">
            <column name="uId" />
            <generator class="native" />
        </id>
        <property name="ufirst" type="java.lang.String">
            <column name="uFirst" />
        </property>
        <property name="usecond" type="java.lang.String">
            <column name="uSecond" />
        </property>
        <property generated="insert" name="uinfo" formula="(select concat(u.uFirst,u.uSecnod) from users u where u.uId = uid)"/>
        <property name="checkScore" formula="fGetCheckScore(uid)"/>
    </class>
</hibernate-mapping>

细节1.既然@Formula 是一个虚拟列,那么数据库中不需要建这一列,同样可以,如果有个列存在,hibernate也会将   其忽略。以上示例中的user就没有count列。

细节2.sql语句必须写在()中,这个以前也有人说过。

细节3.如果有where子查询,那么表需要用别名,比如 select COUNT(*) from user where id=1 是错的

而select COUNT(*) from user u where u.id=1是正确的

细节4.只要是你在数据库的sql控制台执行过的语句,并且使用了表别名,那么@Formula都应该是支持的。

确实formula是一个很常用且好用的东西!

你可能感兴趣的:(数据结构,sql,.net,Hibernate,xml)