Hibernate相关关键字段配置

代码     
Parent parent = (Parent) session.load(Parent.class, pid);    
session.delete(parent);    
   
1. 爸爸那边设置了cascade=all和inverse=true     
a. delete from children     
b. delete from parent    
   
2. 爸爸那边设置了cascade=all,没有设inverse=true     
a. update children set parent_id=null where parent_id=?     
b. delete from children     
c. delete from parent    
   
因为此时inverse=false,所以爸爸要负责维护relationship,所以它要去把children中的连接信息都清空。但是,如果children的parent_id的constraint设置的是not-null的话,那么很不幸,hibernate执行到2.a就会throw exception了。    
   
如果你要问,这个inverse=true到底是在源代码中的哪儿判断的呀?请看代码:     
   
   
代码    
     
......    
   
SessionImpl.flush();    
   
SessionImpl.execute();    
   
SessionImpl.executeAll(collectionRemovals);    
    executable.execute();    
   
ScheduledCollectionRemove.execute();    
    getPersister().remove( getId(), getSession() );    
   
OneToManyPersister(即AbstractCollectionPersister).remove();    
    if ( !isInverse ) {    
        PreparedStatement st = session.getBatcher().prepareBatchStatement( getSQLDeleteString() );    
    }    
   
OneToManyPersister.getSQLDeleteString();    
    return "update children set parent_id=null where parent_id=?";    
   
......    
   



-------------------------------------------------------------------- 
hibernate中inverse的用法 收藏 
一、Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录!

二、Inverse和Cascade的比较 

Inverse:负责控制关系,默认为false,也就是关系的两端都能控制,但这样会造成一些问题,更新的时候会因为两端都控制关系,于是重复更新。一般来说有一端要设为true。 
Cascade:负责控制关联对象的级联操作,包括更新、删除等,也就是说对一个对象进行更新、删除时,其它对象也受影响,比如我删除一个对象,那么跟它是多对一关系的对象也全部被删除。 
举例说明区别:删除“一”那一端一个对象O的时候,如果“多”的那一端的Inverse设为true,则把“多”的那一端所有与O相关联的对象外键清空;如果“多”的那一端的Cascade设为Delete,则把“多”的那一端所有与O相关联的对象全部删除。
通过将<set>元素的lazy属性设置为true来开启集合类型的延迟加载特性


这里我们应用了<cache usage=”read-only”/>配置,如果采用这种策略来配置集合类型,Hibernate将只会对数据索引进行缓存,而不会对集合中的实体对象进行缓存。


<hibernate-mapping>

    <class name=”com.neusoft.entity.User” table=”user”>

…..

<set name=”addresses” table=”address” lazy=”true” inverse=”true”>

<cache usage=”read-write”/>

<key column=”user_id”/>

<one-to-many class=”com.neusoft.entity.Arrderss”/>

</set>

    </class>

</hibernate-mapping>
企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:
                      
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排为一天一次


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

相关推荐