HibernateLab--双向一对多

    技术2022-05-20  48

    package org.niit.ormlab.example2; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class Depart implements Serializable { private Integer did; private String dname; private String ddesc; private Set<Emp> emps = new HashSet<Emp>();//为了提高程序健壮性我们实例化这个属性避免产生空指针异常 public Depart(String dname, String ddesc, Set<Emp> emps) { super(); this.dname = dname; this.ddesc = ddesc; this.emps = emps; } public Set<Emp> getEmps() { return emps; } public void setEmps(Set<Emp> emps) { this.emps = emps; } public Depart() { } public Depart(String dname, String ddesc) { super(); this.dname = dname; this.ddesc = ddesc; } public Depart(Integer did, String dname, String ddesc) { super(); this.did = did; this.dname = dname; this.ddesc = ddesc; } public Integer getDid() { return did; } public void setDid(Integer did) { this.did = did; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public String getDdesc() { return ddesc; } public void setDdesc(String ddesc) { this.ddesc = ddesc; } }

     

    package org.niit.ormlab.example2; import java.io.Serializable; public class Emp implements Serializable { private int eid; private String ename; private String esex; private String eaddr; private String etel; private Depart depart;//many to one public Emp() { // TODO Auto-generated constructor stub } public Emp(String ename, String esex, String eaddr, String etel, Depart depart) { super(); this.ename = ename; this.esex = esex; this.eaddr = eaddr; this.etel = etel; this.depart = depart; } public Emp(int eid, String ename, String esex, String eaddr, String etel, Depart depart) { super(); this.eid = eid; this.ename = ename; this.esex = esex; this.eaddr = eaddr; this.etel = etel; this.depart = depart; } public int getEid() { return eid; } public void setEid(int eid) { this.eid = eid; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getEsex() { return esex; } public void setEsex(String esex) { this.esex = esex; } public String getEaddr() { return eaddr; } public void setEaddr(String eaddr) { this.eaddr = eaddr; } public String getEtel() { return etel; } public void setEtel(String etel) { this.etel = etel; } public Depart getDepart() { return depart; } public void setDepart(Depart depart) { this.depart = depart; } }

     

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="org.niit.ormlab.example2"> <!-- 多对一的【一方】 --> <class name="Depart" table="`Depart`"> <id name="did" column="did" type="integer"> <generator class="identity" /> </id> <property name="dname" column="dname" type="string" /> <property name="ddesc" column="ddesc" type="string" /> <!-- 级联保存更新 --> <set name="emps" table="`Emp`" cascade="save-update,delete"> <!-- 外键信息 --> <key column="did"></key> <!-- 属性对应的类信息 --> <one-to-many class="Emp"/> </set> </class> </hibernate-mapping>

     

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="org.niit.ormlab.example2"> <!-- 多对一的【多方】 --> <class name="Emp" table="`Emp`"> <id name="eid" column="eid" type="integer"> <generator class="identity" /> </id> <property name="ename" column="ename" type="string" /> <property name="esex" column="esex" type="string" /> <property name="etel" column="`etel`" type="string"/> <property name="eaddr" column="eaddr" type="string" /> <!-- many-to-one建立depart属性和外键did之间的映射 name=待映射的持久化类的属性名【Emp类的depart属性】 class=持久化类名 cascade=级联行为 not-null=是否允许为空,影响Hibernate的保存时行为 --> <many-to-one name="depart" class="Depart" column="did" cascade="save-update" not-null="true"/> </class> </hibernate-mapping>

     

     

    测试代码:

    package org.niit.ormlab.example2; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Restrictions; public class Client { /**级联保存部门和员工对象[级联] * 此方法要正常执行依赖cascade="save-update"属性描述 * */ public void saveDepartAndEmpWithCascade(){ Session session = SessionFactory.getSession(); Transaction ts = session.beginTransaction(); try { Depart depart = new Depart("咨询部","咨询部"); Emp emp1 = new Emp("张霞","女","锦江区","112",null); Emp emp2 = new Emp("李梅", "女", "锦江区","112",null); depart.getEmps().add(emp1); depart.getEmps().add(emp2); emp1.setDepart(depart); emp2.setDepart(depart); session.save(depart); ts.commit(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); ts.rollback(); } finally { session.close(); } } /**级联删除部门下的员工对象,该方法正确执行依赖cascade=delete属性描述和inverse="true"属性描述*/ public void removeDepartWithEmps(){ Session session = SessionFactory.getSession(); Transaction ts = session.beginTransaction(); try { Depart depart = (Depart)session.get(Depart.class, 17); session.delete(depart); ts.commit(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); ts.rollback(); } finally { session.close(); } } /** * 修改部门对象和员工对象的关联关系 * 没有inverse="true",以下修改行为将产生两条对emp表的更新语句,这降低了程序性能 * 总结: * 在建立一对多双向关联时,应该在"many"方把inverse属性设置为true以提高应用性能 * 在建立一对多双向关联时,应修改两端的对象的相应属性以提高程序健壮性 * */ public void modifyAssociateDepartAndEmp(){ Session session = SessionFactory.getSession(); Transaction ts = session.beginTransaction(); try { Depart depart = (Depart)session.get(Depart.class,16); Emp emp = (Emp)session .createQuery("from Emp as o where o.eid=?") .setInteger(0,4) .uniqueResult(); depart.getEmps().add(emp);//没有inverse="true",将产生一条对emp表的更新语句 emp.setDepart(depart); //没有inverse="true",将再次产生一条对emp表的更新语句 ts.commit(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); ts.rollback(); } finally { session.close(); } } /** * 查询一个部门对象 * */ public Depart getDepart(int did){ Session session = SessionFactory.getSession(); try { return (Depart)session.get(Depart.class,did); } catch (Exception e) { e.printStackTrace(); } finally { session.close(); } return null; } private void showDepart(Depart depart){ } private void showEmpList(List<Emp> empList){ if (empList!=null && empList.size()>0){ for (Emp emp : empList) { System.out.println(emp.getEid()+"/t"+emp.getEname()+"/t"+emp.getEsex()); } } } public static void main(String[] args) { Client client = new Client(); //测试保存1 //client.saveDepartAndEmpWithCascade(); //测试删除 //client.removeDepartWithEmps(); client.modifyAssociateDepartAndEmp(); } }     


    最新回复(0)