[hibernate] hibernate one to many 和many to one 操作
1.先看表结构 。Father 和son两张表。

2.两个实体类:
/** Father实体 */ public class Father implements Serializable { private int fatherId; private String fatherName; private Date createTime; private String status; private Set<Son> sons; // getter 和setter 省略 } /** Son实体 */ public class Son implements Serializable{ private int sonId; private String sonName; private String status; private Father father; // getter 和setter 省略 }
3.配置文件:
father.hbm.xml:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.xwolf.hibernate.bean.Father" table="FATHER" schema="DATAPROCESS"> <id name="fatherId"> <column name="FATHER_ID" sql-type="number" precision="22" not-null="true"/> </id> <property name="fatherName"> <column name="FATHER_NAME" sql-type="varchar2" length="400"/> </property> <property name="createTime"> <column name="CREATE_TIME" sql-type="date"/> </property> <property name="status"> <column name="STATUS" sql-type="varchar2" length="40"/> </property> <set name="sons" table="SON"> <key column="F_ID" ></key> <one-to-many class="com.xwolf.hibernate.bean.Son" /> </set> </class> </hibernate-mapping>
son.hbm.xml:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.xwolf.hibernate.bean.Son" table="SON" schema="DATAPROCESS"> <id name="sonId"> <column name="SON_ID" sql-type="number" precision="22" not-null="true"/> </id> <property name="sonName"> <column name="SON_NAME" sql-type="varchar2" length="20"/> </property> <property name="status"> <column name="STATUS" sql-type="varchar2" length="4" not-null="true"/> </property> <!-- 多对一关系: name :一方的属性名称 class:对应的类名字 cascade : 级联属性设为delete,删除该记录的同时删除关联的对应表的记录 column: name :多方中关联的外键 --> <many-to-one name="father" class="com.xwolf.hibernate.bean.Father" fetch="join"> <column name="F_ID" not-null="true" sql-type="number"/> </many-to-one> </class> </hibernate-mapping>
测试:
package com.xwolf.hibernate.test; import com.xwolf.hibernate.bean.Father; import com.xwolf.hibernate.bean.Son; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URL; import java.util.List; /** * Created by on 2015/9/24. */ public class TestRealization { private static Session session ; private Logger logger = LoggerFactory.getLogger(this.getClass()); @Before public void before(){ Configuration configuration = new Configuration(); URL url =TestSearch.class.getResource("/hibernate.cfg.xml"); configuration.configure(url); SessionFactory sessionFactory=configuration.buildSessionFactory(); session=sessionFactory.openSession(); logger.info("session 开启....."); } /** * 关联保存 */ @Test public void save(){ Father father= (Father) session.get(Father.class,Integer.valueOf("13")); Son son =new Son(); son.setSonId(31); son.setFather(father); son.setSonName("李斯132"); son.setStatus("143"); Son son1 =new Son(); son1.setSonId(46); //为外键设置关联关系 son1.setFather(father); son1.setSonName("李斯4342"); son1.setStatus("1"); session.save(son); session.save(son1); session.beginTransaction().commit(); } /** * 多对一关系 many to one */ @Test public void test1(){ Son son = (Son) session.get(Son.class, Integer.valueOf("1")); /** * 删除,如设置cascade属性为delete,会同步删除关联的外键的记录 */ session.delete(son); session.beginTransaction().commit(); } /** * 一对多 one to many */ @Test public void test2(){ Father father = (Father) session.load(Father.class, Integer.valueOf(13)); System.out.println(father); //删除 ,同样要关注cascade 属性设置 session.delete(father); session.beginTransaction().commit(); } /** * hql 查询 */ @Test public void fetch(){ //hql 查询 String hql ="from Father"; Query query = session.createQuery(hql); List<Father> fathers=query.list(); for (Father father:fathers){ System.out.println(father); } } @After public void after(){ if(session!=null){ session.close(); logger.info("session关闭..."); } } }
还有很多主要的属性测试没有写测试代码,cascade ,fetch,inverse,formula,lazy,optimistic-lock 等需要深入了解。

浙公网安备 33010602011771号