hibernate3学习之路第二节 原创

在学习过第一节hibernate之后,您对hibernate3有了初步的认识和了解,在第二节中我们重点讲解基于xml的常用映射语法及关系映射,希望通过这一节的内容,你能够对hibernate3有更深一步的认识,愿你有更大的进步…

  1. 基于xml的常用映射语法
  2. 1、表与类的映射需要hbm.xml配置文件,这个文件的根标签是<hibernate-mapping>
  3. 他常用的属性有:
  4. 1default-cascade默认的级联方式nono
  5. 2default-lary默认延时加载true
  6. 3package类的名称,映射配置文件中的类不必再写类名
  7. 2、类与表的映射用<class>标签,配置类和表的属性
  8. 他的常用属性有:
  9. 1、name类的名称
  10. 2、table制定表的名字,若没有指定表名,默认类的名称做表的名字
  11. 3、主键和ID属性的映射用<id>标签
  12. 他的常用属性有:
  13. 1、name类的该属性的变量名
  14. 2、column对应表主键的列名
  15. 面试题:业务主键的生成方式:composite-id
  16. <property>标签
  17. 他的常用属性有:
  18. 1、namejava代码中的属性变量名
  19. 2、type类型名
  20. 3、length该类型的长度
  21. 4、column对应表的列名
  22. 5、unique是否允许更新
  23. 6、insert是否运行插入
  24. 7、not-null是够允许为空
  25. 一、复杂映射
  26. 一对一的关系映射
  27. 一对多的关系映射
  28. 多对多的关系映射
  29. 类的继承关系映射
  30. 组件映射
  31. 表与表之间的实体的映射关系:
  32. 一对一,一对多,多对一,多对多
  33. 类于类的实体关系:
  34. 继承(泛化),依赖,关联,聚合,组合
  35. 详解见:http://student.csdn.net/space.php?uid=1394199&do=blog&id=51397
  36. hibernate一对一关联
  37. 建立一个java项目,添加hibernate类库,添加基本配置文件,搭建好开发环境。
  38. 如果不会详解见:http://student.csdn.net/space.php?uid=1394199&do=blog&id=53227
  39. 1、创建两个javabean类:Person和Address
  40. Person类代码如下:
  41. packagehiber.bean;
  42. importjava.io.Serializable;
  43. publicclassPersonimplementsSerializable{
  44. /**
  45. *
  46. */
  47. privatestaticfinallongserialVersionUID=1L;
  48. /**成员属性*/
  49. /**递增序列的ID*/
  50. privateintid;
  51. /**用户的名称*/
  52. privateStringname;
  53. /**用户的住址*/
  54. privateAddressaddr;
  55. /**默认的构造器*/
  56. publicPerson(){
  57. }
  58. /**带有参数的构造器*/
  59. publicPerson(Stringname,Addressaddr){
  60. this.name=name;
  61. this.addr=addr;
  62. }
  63. /**生成setget方法*/
  64. publicintgetId(){
  65. returnid;
  66. }
  67. publicvoidsetId(intid){
  68. this.id=id;
  69. }
  70. publicStringgetName(){
  71. returnname;
  72. }
  73. publicvoidsetName(Stringname){
  74. this.name=name;
  75. }
  76. publicAddressgetAddr(){
  77. returnaddr;
  78. }
  79. publicvoidsetAddr(Addressaddr){
  80. this.addr=addr;
  81. }
  82. }
  83. Address类代码如下:
  84. packagehiber.bean;
  85. importjava.io.Serializable;
  86. publicclassAddressimplementsSerializable{
  87. /**成员属性*/
  88. /**递增序列的ID*/
  89. privateintid;
  90. /**用户的住址*/
  91. privateStringcontent;
  92. /**默认的构造器*/
  93. publicAddress(){
  94. }
  95. /**带有参数的构造器*/
  96. publicAddress(Stringcontent){
  97. this.content=content;
  98. }
  99. /**相应的setget方法*/
  100. publicintgetId(){
  101. returnid;
  102. }
  103. publicvoidsetId(intid){
  104. this.id=id;
  105. }
  106. publicStringgetContent(){
  107. returncontent;
  108. }
  109. publicvoidsetContent(Stringcontent){
  110. this.content=content;
  111. }
  112. }
  113. 在同一个包下为这两个类创建一个配置文件paddr.hbm.xml
  114. <?xmlversion="1.0"encoding="utf-8"?>
  115. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
  116. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  117. <!--
  118. MappingfileautogeneratedbyMyEclipsePersistenceTools
  119. -->
  120. <hibernate-mappingpackage="hiber.bean">
  121. <!--Person类的映射文件-->
  122. <classname="Person"table="person">
  123. <idname="id">
  124. <generatorclass="native"></generator>
  125. </id>
  126. <propertyname="name"length="40"/>
  127. <one-to-onename="addr"class="Address"constrained="true"
  128. cascade="all">
  129. </one-to-one>
  130. </class>
  131. <!--Address类的映射文件-->
  132. <classname="Address"table="address">
  133. <idname="id">
  134. <generatorclass="native"></generator>
  135. </id>
  136. <propertyname="content"length="100"/>
  137. </class>
  138. </hibernate-mapping>
  139. 在hibernate.cfg.xml引用映射文件
  140. <mappingresource="hiber/bean/paddr.hbm.xml"/>
  141. 创建表:两种方式
  142. 1、<!--创建表-->
  143. <propertyname="hibernate.hbm2ddl.auto">true</property>
  144. <propertyname="hibernate.show_sql">true</property>
  145. 通过以上配置在解析配置文件时,即可创建表。
  146. 2、创建一个CreateTable的类
  147. publicclassCreateTable{
  148. publicstaticvoidmain(String[]args){
  149. /**解析配置文件*/
  150. Configurationcfg=newConfiguration().configure();
  151. SchemaExportse=newSchemaExport(cfg);
  152. se.create(true,true);
  153. }
  154. }
  155. 以下是相应的操作:
  156. /**插入的操作*/
  157. publicvoidinsert(){
  158. /**获取Session对象*/
  159. Sessionsession=HSFactory.getSession();
  160. /**定义一个事物的对象*/
  161. Transactiontx=null;
  162. try{
  163. /**获取事务*/
  164. tx=session.getTransaction();
  165. /**开始事务*/
  166. tx.begin();
  167. for(inti=10;i<20;i++){
  168. Addressaddr=newAddress("河南商丘"+i);
  169. Personp=newPerson("redamy"+i,addr);
  170. /**保存用户时级联保存address*/
  171. session.save(p);
  172. }
  173. tx.commit();
  174. }catch(Exceptionex){
  175. /**事务回滚操作*/
  176. if(tx!=null){
  177. tx.rollback();
  178. }
  179. ex.printStackTrace();
  180. }finally{
  181. /**关闭session*/
  182. HSFactory.closeSession();
  183. }
  184. }
  185. /**用户信息更新的操作*/
  186. publicvoidupdate(){
  187. /**获取Session对象*/
  188. Sessionsession=HSFactory.getSession();
  189. /**定义一个事物的对象*/
  190. Transactiontx=null;
  191. try{
  192. /**获取事务*/
  193. tx=session.getTransaction();
  194. /**开始事务*/
  195. tx.begin();
  196. Addressaddr=newAddress();
  197. addr.setId(8);
  198. addr.setContent("河南郑州");
  199. Personp=newPerson();
  200. p.setId(8);
  201. p.setName("lihui");
  202. p.setAddr(addr);
  203. session.update(p);
  204. /**保存的是人的信息*/
  205. tx.commit();
  206. }catch(Exceptionex){
  207. if(tx!=null){
  208. tx.rollback();
  209. }
  210. ex.printStackTrace();
  211. }finally{
  212. HSFactory.closeSession();
  213. }
  214. }
  215. /**
  216. *删除Person对象并不会级联删除Person的地址信息
  217. */
  218. publicvoiddelete(){
  219. /**获取Session对象*/
  220. Sessionsession=HSFactory.getSession();
  221. /**定义一个事物的对象*/
  222. Transactiontx=null;
  223. try{
  224. /**获取事务*/
  225. tx=session.getTransaction();
  226. /**开始事务*/
  227. tx.begin();
  228. Personp=newPerson();
  229. p.setId(1);
  230. /**删除Person执行语句是:Hibernate:deletefrompersonwhereid=?*/
  231. session.delete(p);
  232. tx.commit();
  233. }catch(Exceptionex){
  234. if(tx!=null){
  235. tx.rollback();
  236. }
  237. ex.printStackTrace();
  238. }finally{
  239. HSFactory.closeSession();
  240. }
  241. }
  242. /**
  243. *删除地址对象,当地址有对应的用户时会报异常信息Hibernate:deletefromaddresswhereid=?
  244. *org.hibernate.exception.ConstraintViolationException:Couldnotexecute
  245. *JDBCbatchupdate因此在删除地址对象时候应先删除该用户的信息才能够删除用户的地址
  246. */
  247. publicvoiddeleteAddr(){
  248. /**获取Session对象*/
  249. Sessionsession=HSFactory.getSession();
  250. /**定义一个事物的对象*/
  251. Transactiontx=null;
  252. try{
  253. /**获取事务*/
  254. tx=session.getTransaction();
  255. /**开始事务*/
  256. tx.begin();
  257. Addressaddr=newAddress();
  258. addr.setId(2);
  259. /**删除地址对象?在这里你可以自己实现?*/
  260. session.delete(addr);
  261. tx.commit();
  262. }catch(Exceptionex){
  263. if(tx!=null){
  264. tx.rollback();
  265. }
  266. ex.printStackTrace();
  267. }finally{
  268. HSFactory.closeSession();
  269. }
  270. }
  271. /**根据用户ID查询用户信息操作*/
  272. publicPersongetById(intid){
  273. /**获取Session对象*/
  274. Sessionsession=HSFactory.getSession();
  275. Personp=null;
  276. try{
  277. p=(Person)session.get(Person.class,id);
  278. /**
  279. *在这里可以直接输出用户的属性值.....如果在这里没有返回返回对象之后就不能返回到
  280. *地址信息了?因为session已经关闭,可采用<hibernate-mapping>标签中加入
  281. *default-lazy="false"解决此问题。也可以在这里使用
  282. *hibernate.initialize(p.getAddr());初始化地址对象。
  283. */
  284. }catch(Exceptionex){
  285. ex.printStackTrace();
  286. }finally{
  287. HSFactory.closeSession();
  288. }
  289. returnp;
  290. }
  291. 设置cascade="all",插入,更新,查询可以级联,但是删除不能级联为什么呢?可以思考?
  292. 答:当<onetoone>标签设置constrained="true"cascade="all"级联删除失效
  293. 二、hibernate一对多关联
  294. 创建两个javabean:User和Message
  295. Message类代码如下:
  296. packagehiber.bean1;
  297. importjava.io.Serializable;
  298. importjava.sql.Timestamp;
  299. publicclassMessageimplementsSerializable{
  300. /**
  301. *
  302. */
  303. privatestaticfinallongserialVersionUID=1L;
  304. /**递增序列的ID*/
  305. privateintid;
  306. /**用户的留言内容*/
  307. privateStringcontent;
  308. /**用户留言时间*/
  309. privateTimestampldate;
  310. /**默认的构造器*/
  311. publicMessage(){
  312. }
  313. /**带有参数的构造器*/
  314. publicMessage(Stringcontent,Timestampldate){
  315. this.content=content;
  316. this.ldate=ldate;
  317. }
  318. /**setget方法*/
  319. publicintgetId(){
  320. returnid;
  321. }
  322. publicvoidsetId(intid){
  323. this.id=id;
  324. }
  325. publicStringgetContent(){
  326. returncontent;
  327. }
  328. publicvoidsetContent(Stringcontent){
  329. this.content=content;
  330. }
  331. publicTimestampgetLdate(){
  332. returnldate;
  333. }
  334. publicvoidsetLdate(Timestampldate){
  335. this.ldate=ldate;
  336. }
  337. }
  338. User类代码如下:
  339. packagehiber.bean1;
  340. importjava.io.Serializable;
  341. importjava.sql.Timestamp;
  342. importjava.util.HashSet;
  343. importjava.util.Set;
  344. publicclassUserimplementsSerializable{
  345. /**
  346. *
  347. */
  348. privatestaticfinallongserialVersionUID=1L;
  349. /**成员属性*/
  350. /**递增序列的ID*/
  351. privateintid;
  352. /**用户的名称*/
  353. privateStringname;
  354. /**用户的密码*/
  355. privateStringpass;
  356. /**用户的邮箱*/
  357. privateStringemail;
  358. /**用户注册的时间*/
  359. privateTimestamprdate;
  360. /**用户留言信息的集合*/
  361. privateSet<Message>allMsg=newHashSet<Message>();
  362. /**默认的构造器*/
  363. publicUser(){
  364. }
  365. /**带有参数的构造器*/
  366. publicUser(Stringname,Stringpass,Stringemail,Timestamprdate,
  367. Set<Message>allMsg){
  368. this.name=name;
  369. this.pass=pass;
  370. this.email=email;
  371. this.rdate=rdate;
  372. this.allMsg=allMsg;
  373. }
  374. /**setget方法*/
  375. publicintgetId(){
  376. returnid;
  377. }
  378. publicvoidsetId(intid){
  379. this.id=id;
  380. }
  381. publicStringgetName(){
  382. returnname;
  383. }
  384. publicvoidsetName(Stringname){
  385. this.name=name;
  386. }
  387. publicStringgetPass(){
  388. returnpass;
  389. }
  390. publicvoidsetPass(Stringpass){
  391. this.pass=pass;
  392. }
  393. publicStringgetEmail(){
  394. returnemail;
  395. }
  396. publicvoidsetEmail(Stringemail){
  397. this.email=email;
  398. }
  399. publicSet<Message>getAllMsg(){
  400. returnallMsg;
  401. }
  402. publicvoidsetAllMsg(Set<Message>allMsg){
  403. this.allMsg=allMsg;
  404. }
  405. publicTimestampgetRdate(){
  406. returnrdate;
  407. }
  408. publicvoidsetRdate(Timestamprdate){
  409. this.rdate=rdate;
  410. }
  411. }
  412. 创建配置文件
  413. <?xmlversion="1.0"encoding="utf-8"?>
  414. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
  415. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  416. <!--
  417. MappingfileautogeneratedbyMyEclipsePersistenceTools
  418. -->
  419. <hibernate-mappingpackage="hiber.bean1"default-lazy="false">
  420. <classname="User"table="user">
  421. <idcolumn="id"name="id">
  422. <generatorclass="native"/>
  423. </id>
  424. <propertycolumn="name"length="20"name="name"type="string"/>
  425. <propertycolumn="pass"length="12"name="pass"type="string"/>
  426. <propertycolumn="email"length="40"name="email"type="string"/>
  427. <propertyname="rdate"type="timestamp"/>
  428. <setname="allMsg"cascade="delete,save-update"lazy="false"inverse="true">
  429. <key>
  430. <columnname="uid"></column>
  431. </key>
  432. <one-to-manyclass="Message"/>
  433. </set>
  434. </class>
  435. <classname="Message"table="message">
  436. <idname="id">
  437. <generatorclass="native"/>
  438. </id>
  439. <propertyname="content"/>
  440. <propertyname="ldate"/>
  441. </class>
  442. </hibernate-mapping>
  443. 记得要在hiberante.cfg.xml文件中添加Mapping
  444. 操作关联
  445. /**插入记录*/
  446. publicvoidinsert(){
  447. /**获取Session对象*/
  448. Sessionsession=HSFactory.getSession();
  449. /**定义一个事物的对象*/
  450. Transactiontx=null;
  451. try{
  452. /**获取事务*/
  453. tx=session.getTransaction();
  454. /**开始事务*/
  455. tx.begin();
  456. /**为每个用户添加十条留言信息*/
  457. for(inti=0;i<10;i++){
  458. Useru=newUser();
  459. u.setName("redarmy"+i);
  460. u.setPass("123"+i);
  461. u.setEmail("redarmy"+i+".@gmail.com");
  462. u.setRdate(newTimestamp(System.currentTimeMillis()));
  463. for(intj=0;j<10;j++){
  464. Messagemsg=newMessage();
  465. msg.setContent("你好"+j);
  466. msg
  467. .setLdate(newTimestamp(System.currentTimeMillis()
  468. *(j)));
  469. u.getAllMsg().add(msg);
  470. }
  471. /**级联保存message*/
  472. session.save(u);
  473. /**
  474. *当在<set才用默认的inverse="false"的时候></set>
  475. *执行语句:
  476. *Hibernate:insertintouser(name,pass,email,rdate)values(?,?,?,?)
  477. *Hibernate:insertintomessage(content,ldate)values(?,?)
  478. *..............
  479. *执行插入完后回执行
  480. *Hibernate:updatemessagesetuid=?whereid=?
  481. *Hibernate:updatemessagesetuid=?whereid=?
  482. *...会吧所有的留言信息更新一遍
  483. *
  484. *当在<set采用inverse="true"的时候></set>
  485. *执行的语句:
  486. *Hibernate:insertintouser(name,pass,email,rdate)values(?,?,?,?)
  487. *Hibernate:insertintomessage(content,ldate)values(?,?)
  488. *会在处理的时候不会执行update语句一次插入
  489. *但是执行的结果呢?在查看数据库的时候可以查看呀!
  490. *自己一定要动手呀!
  491. **/}
  492. tx.commit();
  493. }catch(Exceptionex){
  494. if(tx!=null){
  495. tx.rollback();
  496. }
  497. ex.printStackTrace();
  498. }finally{
  499. HSFactory.closeSession();
  500. }
  501. }
  502. publicUsergetById(intid){
  503. Userentity=null;
  504. /**获取Session对象*/
  505. Sessionsession=HSFactory.getSession();
  506. try{
  507. entity=(User)session.get(User.class,id);
  508. /**当session关闭后在使用getAllMsg方法获取该用户的所有留言信息时
  509. *会出现:org.hibernate.LazyInitializationException:异常
  510. *此异常为延迟加载的异常
  511. *解决方法1可以为hibernate-mapping跟标签加上default-lazy=false解决
  512. *解决方法2可以为<set.标签加上lazy=false解决
  513. *解决方法3:可以使用hibernate.initialize(entity.getAllMsg());
  514. *解决方法4可以在关闭session之前使用一次getAllMsg的方法即可代码如下*///System.out.println(entity.getAllMsg().size()+"留言的数量");
  515. }catch(Exceptionex){
  516. ex.printStackTrace();
  517. }finally{
  518. HSFactory.closeSession();
  519. }
  520. returnentity;
  521. }
  522. 对于更新..删除可以自己动手实验一下?
  523. 注意当你删除Use的对象时候,会通过级联删除所有用户的留言信息
  524. 三、hibernate多对一关联
  525. 创建两个javabean:User和Message
  526. Message类代码如下:
  527. packagehiber.bean2;
  528. importjava.io.Serializable;
  529. importjava.sql.Timestamp;
  530. publicclassMessageimplementsSerializable{
  531. /**
  532. *
  533. */
  534. privatestaticfinallongserialVersionUID=1L;
  535. /**递增序列的ID*/
  536. privateintid;
  537. /**用户的留言内容*/
  538. privateStringcontent;
  539. /**用户留言时间*/
  540. privateTimestampldate;
  541. /**创建一个用户的对象*/
  542. privateUseruser;
  543. /**默认的构造器*/
  544. publicMessage(){
  545. }
  546. /**带有参数的构造器*/
  547. publicMessage(Stringcontent,Timestampldate,Useruser){
  548. this.content=content;
  549. this.ldate=ldate;
  550. this.user=user;
  551. }
  552. /**setget方法*/
  553. publicintgetId(){
  554. returnid;
  555. }
  556. publicvoidsetId(intid){
  557. this.id=id;
  558. }
  559. publicStringgetContent(){
  560. returncontent;
  561. }
  562. publicvoidsetContent(Stringcontent){
  563. this.content=content;
  564. }
  565. publicTimestampgetLdate(){
  566. returnldate;
  567. }
  568. publicvoidsetLdate(Timestampldate){
  569. this.ldate=ldate;
  570. }
  571. publicUsergetUser(){
  572. returnuser;
  573. }
  574. publicvoidsetUser(Useruser){
  575. this.user=user;
  576. }
  577. }
  578. User类代码如下:
  579. packagehiber.bean2;
  580. importjava.io.Serializable;
  581. importjava.sql.Timestamp;
  582. importjava.util.HashSet;
  583. importjava.util.Set;
  584. publicclassUserimplementsSerializable{
  585. /**
  586. *
  587. */
  588. privatestaticfinallongserialVersionUID=1L;
  589. /**成员属性*/
  590. /**递增序列的ID*/
  591. privateintid;
  592. /**用户的名称*/
  593. privateStringname;
  594. /**用户的密码*/
  595. privateStringpass;
  596. /**用户的邮箱*/
  597. privateStringemail;
  598. /**用户注册的时间*/
  599. privateTimestamprdate;
  600. /**默认的构造器*/
  601. publicUser(){
  602. }
  603. /**带有参数的构造器*/
  604. publicUser(Stringname,Stringpass,Stringemail,Timestamprdate){
  605. this.name=name;
  606. this.pass=pass;
  607. this.email=email;
  608. this.rdate=rdate;
  609. }
  610. /**setget方法*/
  611. publicintgetId(){
  612. returnid;
  613. }
  614. publicvoidsetId(intid){
  615. this.id=id;
  616. }
  617. publicStringgetName(){
  618. returnname;
  619. }
  620. publicvoidsetName(Stringname){
  621. this.name=name;
  622. }
  623. publicStringgetPass(){
  624. returnpass;
  625. }
  626. publicvoidsetPass(Stringpass){
  627. this.pass=pass;
  628. }
  629. publicStringgetEmail(){
  630. returnemail;
  631. }
  632. publicvoidsetEmail(Stringemail){
  633. this.email=email;
  634. }
  635. publicTimestampgetRdate(){
  636. returnrdate;
  637. }
  638. publicvoidsetRdate(Timestamprdate){
  639. this.rdate=rdate;
  640. }
  641. }
  642. 创建hbm.xml配置文件
  643. <?xmlversion="1.0"encoding="utf-8"?>
  644. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
  645. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  646. <!--
  647. MappingfileautogeneratedbyMyEclipsePersistenceTools
  648. -->
  649. <hibernate-mappingdefault-lazy="false"package="hiber.bean2">
  650. <classname="User"table="user">
  651. <idcolumn="id"name="id">
  652. <generatorclass="native"/>
  653. </id>
  654. <propertycolumn="name"length="20"name="name"type="string"/>
  655. <propertycolumn="pass"length="12"name="pass"type="string"/>
  656. <propertycolumn="email"length="40"name="email"type="string"/>
  657. <propertyname="rdate"type="timestamp"/>
  658. </class>
  659. <classname="Message"table="message">
  660. <idname="id">
  661. <generatorclass="native"/>
  662. </id>
  663. <propertyname="content"/>
  664. <propertyname="ldate"/>
  665. <many-to-onename="user"class="User"column="uid"
  666. cascade="save-update"/>
  667. </class>
  668. </hibernate-mapping>
  669. 记得要在hiberante.cfg.xml文件中添加Mapping
  670. 操作关联
  671. /**多对一单向关联案例*/
  672. /**插入的操作*/
  673. publicvoidinsert(){
  674. /**获取session*/
  675. Sessionsession=HSFactory.getSession();
  676. /**定义事务对象*/
  677. Transactiontx=null;
  678. try{
  679. /**获取事务*/
  680. tx=session.getTransaction();
  681. /**开始事务*/
  682. tx.begin();
  683. /**实现对一个用户插入10个留言信息*/
  684. for(inti=1;i<=10;i++){
  685. Useruser=newUser("liulan","123","liulan@gmail.com",
  686. newTimestamp(System.currentTimeMillis()/(i)));
  687. for(intj=1;j<=10;j++){
  688. Messagemsg=newMessage();
  689. msg.setContent("redarmy!hello"+j);
  690. msg.setLdate(newTimestamp(System.currentTimeMillis()
  691. /(j+10)));
  692. msg.setUser(user);
  693. /**保存Msg信息*/
  694. session.save(msg);
  695. }
  696. }
  697. /**提交事务的操作*/
  698. tx.commit();
  699. }catch(Exceptionex){
  700. if(tx!=null){
  701. tx.rollback();
  702. }
  703. ex.printStackTrace();
  704. }finally{
  705. HSFactory.closeSession();
  706. }
  707. }
  708. 对于Msg表的删除,修改,查询可以自己动手实现?
  709. 但是在这种多对一关联的时候,如果想要实现在一对多的功能显然比较费劲,但是在实际开发中我们使用下面的双向关联。
  710. 四、hibernate一对多的双向关联
  711. 创建两个javabean:User和Message
  712. Message成员属性
  713. privateIntegerid;
  714. privateUseruser;
  715. privateStringcontent;
  716. privateTimestampldate;
  717. User成员属性
  718. privateIntegerid;
  719. privateStringname;
  720. privateStringpass;
  721. privateStringemail;
  722. privateTimestamprdate;
  723. privateSetmessages=newHashSet(0);
  724. 以上的量类中各自包含了对方这就是双向关联,并且省略了构造器和setget方法,如果您对关系关联还不理解,请参考:
  725. http://student.csdn.net/space.php?uid=1394199&do=blog&id=51397
  726. 创建配置文件
  727. User.Hbm.xml的配置文件
  728. <?xmlversion="1.0"encoding="utf-8"?>
  729. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
  730. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  731. <!--
  732. MappingfileautogeneratedbyMyEclipsePersistenceTools
  733. -->
  734. <hibernate-mapping>
  735. <classname="hiber.bean.User"table="user"catalog="houtai">
  736. <idname="id"type="java.lang.Integer">
  737. <columnname="id"/>
  738. <generatorclass="native"/>
  739. </id>
  740. <propertyname="name"type="java.lang.String">
  741. <columnname="name"length="20"/>
  742. </property>
  743. <propertyname="pass"type="java.lang.String">
  744. <columnname="pass"length="12"/>
  745. </property>
  746. <propertyname="email"type="java.lang.String">
  747. <columnname="email"length="40"/>
  748. </property>
  749. <propertyname="rdate"type="java.sql.Timestamp">
  750. <columnname="rdate"length="19"/>
  751. </property>
  752. <setname="messages"inverse="true">
  753. <key>
  754. <columnname="uid"/>
  755. </key>
  756. <one-to-manyclass="hiber.bean.Message"/>
  757. </set>
  758. </class>
  759. </hibernate-mapping>
  760. Message.hbm.xml的配置文件
  761. <?xmlversion="1.0"encoding="utf-8"?>
  762. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
  763. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  764. <!--
  765. MappingfileautogeneratedbyMyEclipsePersistenceTools
  766. -->
  767. <hibernate-mapping>
  768. <classname="hiber.bean.Message"table="message"catalog="houtai">
  769. <idname="id"type="java.lang.Integer">
  770. <columnname="id"/>
  771. <generatorclass="native"/>
  772. </id>
  773. <many-to-onename="user"class="hiber.bean.User"cascade="save-update">
  774. <columnname="uid"/>
  775. </many-to-one>
  776. <propertyname="content"type="java.lang.String">
  777. <columnname="content"/>
  778. </property>
  779. <propertyname="ldate"type="java.sql.Timestamp">
  780. <columnname="ldate"length="19"/>
  781. </property>
  782. </class>
  783. </hibernate-mapping>
  784. 操作关联
  785. /**为每一个用户添加10条留言信息的操作*/
  786. publicvoidinsert(){
  787. /**获取session*/
  788. Sessionsession=HibernateSessionFactory.getSession();
  789. /**定义事务对象*/
  790. Transactiontx=null;
  791. try{
  792. /**获取事务*/
  793. tx=session.getTransaction();
  794. /**开始事务*/
  795. tx.begin();
  796. /**为每个用户添加十个留言信息*/
  797. for(intj=1;j<=10;j++){
  798. Useruser=newUser();
  799. user.setName("name"+j);
  800. user.setEmail("email"+j);
  801. user.setPass("123");
  802. user.setRdate(newTimestamp(System.currentTimeMillis()
  803. /(10*j)));
  804. for(inti=1;i<=10;i++){
  805. Messagemsg=newMessage();
  806. msg.setContent("redarmy!hello"+i);
  807. msg.setLdate(newTimestamp(System.currentTimeMillis()/i));
  808. /**为该留言指明留言的用户*/
  809. msg.setUser(user);
  810. /**
  811. *由于在UserJava中声明并创建Set<Message>messages的集合和setget方法
  812. *所以可以获取该User用户的messages的集合并给该用户添加相应的留言信息
  813. */
  814. user.getMessages().add(msg);
  815. /**
  816. *保存Msg信息的时候通过设置了在<manytoone>标签中设置
  817. *cascade="save-update",所以在保存留言信息的时候,会自动先保存
  818. *一端User的信息,在保存Many端的Msg信息执行代码如下:Hibernate:insertinto
  819. *houtai.user(name,pass,email,rdate)values(?,?,?,
  820. *?)Hibernate:insertintohoutai.message(uid,content,
  821. *ldate)values(?,?,?)通过以上两行代码可以看出设置级联是先执行一端的插入
  822. *然后执行多端的插入.
  823. **/
  824. session.save(msg);
  825. }
  826. }
  827. /**提交事务的操作*/
  828. tx.commit();
  829. }catch(Exceptionex){
  830. if(tx!=null){
  831. tx.rollback();
  832. }
  833. ex.printStackTrace();
  834. }finally{
  835. HibernateSessionFactory.closeSession();
  836. }
  837. }
  838. /**插入User一方一条记录观察是否影响到Message多端*/
  839. publicvoidinsertUser(){
  840. /**获取session*/
  841. Sessionsession=HibernateSessionFactory.getSession();
  842. /**定义事务对象*/
  843. Transactiontx=null;
  844. try{
  845. /**获取事务*/
  846. tx=session.getTransaction();
  847. /**开始事务*/
  848. tx.begin();
  849. /**在多对一关系映射中在一端插入一条记录不影响多端*/
  850. Useruser=newUser();
  851. user.setName("redarmy");
  852. session.save(user);
  853. /**提交事务的操作*/
  854. tx.commit();
  855. }catch(Exceptionex){
  856. if(tx!=null){
  857. tx.rollback();
  858. }
  859. ex.printStackTrace();
  860. }finally{
  861. HibernateSessionFactory.closeSession();
  862. }
  863. }
  864. /**删除用户时,应当删除用户所有留言信息实现方式如下*/
  865. publicvoiddeleteUser(){
  866. /**获取session*/
  867. Sessionsession=HibernateSessionFactory.getSession();
  868. /**定义事务对象*/
  869. Transactiontx=null;
  870. try{
  871. /**获取事务*/
  872. tx=session.getTransaction();
  873. /**开始事务*/
  874. tx.begin();
  875. /**第一步获取删除的用户信息*/
  876. Useruser=(User)session.get(User.class,11);
  877. /**获取该用户的所有留言信息*/
  878. Set<Message>allMsg=user.getMessages();
  879. for(Messagemsg:allMsg){
  880. /**当删除用户的留言信息,并不影响一端,如果要先删除一端User必须手动删除*/
  881. session.delete(msg);
  882. }
  883. /**
  884. *删除用户信息的时候,应先删除该用户的所有留言,不然会出现异常信息如下:
  885. *org.hibernate.exception.ConstraintViolationException:Couldnot
  886. *executeJDBCbatchupdate
  887. */
  888. session.delete(user);
  889. /**提交事务的操作*/
  890. tx.commit();
  891. }catch(Exceptionex){
  892. if(tx!=null){
  893. tx.rollback();
  894. }
  895. ex.printStackTrace();
  896. }finally{
  897. HibernateSessionFactory.closeSession();
  898. }
  899. }
  900. /**删除Msg信息观察是否影响到一端User端*/
  901. publicvoiddeleteMsg(){
  902. /**获取session*/
  903. Sessionsession=HibernateSessionFactory.getSession();
  904. /**定义事务对象*/
  905. Transactiontx=null;
  906. try{
  907. /**获取事务*/
  908. tx=session.getTransaction();
  909. /**开始事务*/
  910. tx.begin();
  911. /**在删除留言信息的时候,虽然有外键关联,但也可以删除并不影响一端的关联*/
  912. Messagemsg=(Message)session.get(Message.class,96);
  913. session.delete(msg);
  914. /**提交事务的操作*/
  915. tx.commit();
  916. }catch(Exceptionex){
  917. if(tx!=null){
  918. tx.rollback();
  919. }
  920. ex.printStackTrace();
  921. }finally{
  922. HibernateSessionFactory.closeSession();
  923. }
  924. }
  925. /**更新Msg信息*/
  926. publicvoidupdateMsg(){
  927. /**获取session*/
  928. Sessionsession=HibernateSessionFactory.getSession();
  929. /**定义事务对象*/
  930. Transactiontx=null;
  931. try{
  932. /**获取事务*/
  933. tx=session.getTransaction();
  934. /**开始事务*/
  935. tx.begin();
  936. /**在双向关联体现*/
  937. Messagemsg=(Message)session.get(Message.class,9);
  938. Useruser=(User)session.get(User.class,1);
  939. msg.setContent("ssssssssssssssssssssss");
  940. msg.setUser(user);
  941. session.update(msg);
  942. /**提交事务的操作*/
  943. tx.commit();
  944. }catch(Exceptionex){
  945. if(tx!=null){
  946. tx.rollback();
  947. }
  948. ex.printStackTrace();
  949. }finally{
  950. HibernateSessionFactory.closeSession();
  951. }
  952. }
  953. /**查询某个留言*/
  954. publicMessagefindMsgById(intid){
  955. Messagemsg=null;
  956. /**获取session*/
  957. Sessionsession=HibernateSessionFactory.getSession();
  958. try{
  959. msg=(Message)session.get(Message.class,id);
  960. }catch(Exceptionex){
  961. ex.printStackTrace();
  962. }finally{
  963. HibernateSessionFactory.closeSession();
  964. }
  965. returnmsg;
  966. }
  967. /**查询某个用户的所有留言信息*/
  968. publicMessagefindUserMsgsById(intid){
  969. Messagemsg=null;
  970. /**获取session*/
  971. Sessionsession=HibernateSessionFactory.getSession();
  972. try{
  973. Userentity=(User)session.get(User.class,id);
  974. System.out.println(entity.getMessages().size());
  975. }catch(Exceptionex){
  976. ex.printStackTrace();
  977. }finally{
  978. HibernateSessionFactory.closeSession();
  979. }
  980. returnmsg;
  981. }
  982. 以上中用到了inverse与cascade如果您此不理解请参考下次内容
  983. 希望以上内容对学员学习hibernate有所帮助,以上内容属redarmy_chen版权所有,如要转发请注明出处。愿你有所收获!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值