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服务启动,并设置为自动启动,否则你的作业不会被执行
?
?
?
?
?