hibernate3 generated 和 access 属性 - 点滴记忆*记忆点滴
收藏本站

hibernate3 generated 和 access 属性

    generated 用于有数据库默认值的获取方式设置。枚举类型有‘never’,‘insert’,‘always’ 三个可选值,默认never。

    never(默认):标明此属性值不是从数据库中生成, 也就是根本不用刷新实体类了。

    insert:标明此属性值在insert的时候生成,但是不会在随后的update时重新生成。也就是只在insert情况下才会刷新实体类。

    always:标明此属性值在insert和update时都会被生成。也就是在insert,update情况下都会刷新实体类。

    如果类的一个某字段不需要手工插入,而由数据库生成表创建时设置的默认值,如数据库创建时间戳属性.      

当该字段配置的 generated设为always,则每当执行SQL INSERT或UPDATE时,在插入或更新后会,立即执行SELECT,以填充该字段。hibernate会在插入后自动的执行一个select,给实体类中的属性设置。如果没有设置generated属性,需要显式调用session.flush()语句。 这里就是说, 数据库默认生成值的字段,必须通过select后把值传给java实体的该属性。

使用property映射中的generated开关启用这个自动刷新:

<property name="lastModified" column="LAST_MODIFIED" update="false" insert="false" generated="always"/>

标记为数据库生成的属性还必须是非可插入和非可更新的,用insert和update属性进行控制它们。如果两者都设置为false,属性的列就永 远不会出现在INSERT或者UPDATE语句中---属性值是只读的。而且通常不在类中给不可变的属性添加公有的设置方法(这时应切换到字段访问),当没有设置setter 方法时,就可以通过设置属性access="field" 来直接设置字段值。


也可以实体声明中设置<class name="Student" table="STUDENT" dynamic-insert="true" dynamic-update="true"> 

因为有了dynamic-insert="true" dynamic-update="true", 那么没有设值的属性(age,createTime,updateTime)就不会出现在insert,update的数据库执行语句中,所以也就没有必要在各属性上使用insert="false" update="false"。

Hibernate 在存储或者取数据的时候会自动访问持久化类的getXXX()和setXXX()方法。存时用getXXX(),取时用setXXX(),但是Hibernate并不会直接访问持久化类中的变量属性(name),而是调用getName(),和setName()的方法。因此即使持久化类中没 有申明name变量,但只要有getName(),和setName()的方法存在,并且在Customer.hbm.xml中映射过name变量

(<property name=”name” column=”NAME”/>),Hibernate就允许利用get和set方法从数据库中对字段NAME进行操作。但是如果在申明中加入

<property name=”name” column=”NAME” access=”field”>那么程序运行时,Hibernate就会直接访问Customer实例所对应的持久化类的name变量属性,而不是 先去访问getName()和setName()方法,如果name变量属性不存在则会抛出 net.sf.hibernate.PropertyNotFoundException异常

    留下足迹