20160507-hibernate入门
2016-05-09 09:44
351 查看
[b]关联映射[/b]
多对一(Employee - Department)
一对多(Department-Employee)
一对一(Person - IDCard)
多对多(teacher - student)
组件映射(User-Name)
集合映射(set, list, map, bag)
inverse和cascade(Employee – Department)
多对一(Employee - Department)
映射文件<many-to-one name=”depart” column=”depart_id”/>
ER图
举例:
Department.java
Employee.java
Department.hbm.xml
Employee.hbm.xml
测试代码:
一对多(Department-Employee)
一对一(Person - IdCard)
1)基于主键的one-to-one(person的映射文件)
例子:
Person.java 主对象
IDCard.java 从对象
IDCard.hbm.xml
Person.hbm.xml
测试代码:
OneToOne.java
2)基于外健的one-to-one,可以描述为多对一,加unique=“true”约束
多对多(teacher - student)
在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。
<set name="teacher" table="teacher_student">
<key column="teacher_id"/>
<many-to-many class="Student" column="student_id"/>
</set>
l
组件映射(User-Name)
关联的属性是个复杂类型的持久化类,但不是实体即:数据库中没有表与该属性对应,但该类的属性要之久保存的。
当组件的属性不能和表中的字段简单对应的时候可以选择实现:
org.hibernate.usertype. UserType或
org.hibernate.usertype. CompositeUserType
只会产生一张表
关联关系的级联操作
多对一(Employee - Department)
一对多(Department-Employee)
一对一(Person - IDCard)
多对多(teacher - student)
组件映射(User-Name)
集合映射(set, list, map, bag)
inverse和cascade(Employee – Department)
多对一(Employee - Department)
映射文件<many-to-one name=”depart” column=”depart_id”/>
ER图
举例:
Department.java
package com.dzq.domain; import java.io.Serializable; import java.util.Set; public class Department implements Serializable{ private int id; private String name; private Set<Employee> empls; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Employee> getEmpls() { return empls; } public void setEmpls(Set<Employee> empls) { this.empls = empls; } }
Employee.java
package com.dzq.domain; import java.io.Serializable; public class Employee implements Serializable{ private int id; private String name; private Department depart; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Department getDepart() { return depart; } public void setDepart(Department depart) { this.depart = depart; } }
Department.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.dzq.domain"> <class name="Department" table="department"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" column="name" /> </class> </hibernate-mapping>
Employee.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.dzq.domain"> <class name="Employee" table="employee"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" column="name" /> <many-to-one name="depart" column="depart_id" /> </class> </hibernate-mapping>
测试代码:
public static void addEmAndDe(){ Employee em=new Employee(); Department depart=new Department(); depart.setName("FBI"); em.setDepart(depart); em.setName("AK47"); HibernateUntils.add(depart); HibernateUntils.add(em); }
一对多(Department-Employee)
<set name=”employees”> <key column=”depart_id”/> <one-to-many class=”Employee”/> </set>
一对一(Person - IdCard)
1)基于主键的one-to-one(person的映射文件)
<id name=”id”> <generator class=”foreign”><param name=”property”>idCard</param></generator> <id> <one-to-one name=”idCard” constrained=”true”/>
例子:
Person.java 主对象
package com.dzq.domain; import java.io.Serializable; public class Person implements Serializable{ private int id; private String name; private IDCard idcard; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public IDCard getIdcard() { return idcard; } public void setIdcard(IDCard idcard) { this.idcard = idcard; } }
IDCard.java 从对象
package com.dzq.domain; import java.io.Serializable; public class IDCard implements Serializable{ private int id; private String name; private Person person; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
IDCard.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.dzq.domain"> <class name="IDCard" table="id_card"> <id name="id" column="id"> <generator class="foreign"> <param name="property">person</param> </generator> </id> <property name="name" column="name" /> <one-to-one name="person" constrained="true"/> </class> </hibernate-mapping>
Person.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.dzq.domain"> <class name="Person" table="person"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" column="name" /> <one-to-one name="idcard"/> </class> </hibernate-mapping>
测试代码:
OneToOne.java
package com.dzq.test; import org.hibernate.Session; import org.hibernate.Transaction; import com.dzq.domain.IDCard; import com.dzq.domain.Person; import com.dzq.utils.HibernateUntils; public class OneToOne { public static void main(String[] args) { add(); queryPerson(1); queryIDcard(1); } public static Person add(){ Session s=null; Transaction ts=null; try { s=HibernateUntils.getSession(); Person p=new Person(); IDCard idcard=new IDCard(); idcard.setName("0606"); p.setName("ll"); p.setIdcard(idcard); idcard.setPerson(p); ts=s.beginTransaction(); s.save(p); s.save(idcard); ts.commit(); return p; } catch (Exception e) { if(ts!=null) ts.rollback(); throw new RuntimeException(e); }finally{ if(s!=null){ s.close(); } } } /** * 查询主对象,用连接表查询 * @param id * @return */ public static Person queryPerson(int id){ Session s=null; try { s=HibernateUntils.getSession(); Person p=(Person) s.get(Person.class, id); System.out.println(p.getIdcard().getName()); return p; } finally{ if(s!=null){ s.close(); } } } /** * 查询从对象,查询两次 * @param id * @return */ public static IDCard queryIDcard(int id){ Session s=null; try { s=HibernateUntils.getSession(); IDCard idc= (IDCard) s.get(IDCard.class, id); System.out.println(idc.getPerson().getName()); return idc; } finally{ if(s!=null){ s.close(); } } } }
2)基于外健的one-to-one,可以描述为多对一,加unique=“true”约束
<one-to-one name=”idCard” property-ref=“person”/> <!-property-ref用于指定关联类的一个属性,这个属性将会和本外键相对应 --> <many-to-one name=”person” column=”person_id” unique=”true” not-null=”true”/> <!-唯一的多对一,其实就便成了一对一了-->
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.dzq.domain"> <class name="IDCard" table="id_card"> <id name="id" column="id"> <!-- <generator class="foreign"> <param name="property">person</param> </generator> --> <generator class="native"/> </id> <property name="name" column="name" /> <!-- <one-to-one name="person" constrained="true"/> --> <many-to-one name="person" column="person_id" unique="true"/> </class> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.dzq.domain"> <class name="Person" table="person"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" column="name" /> <!-- <one-to-one name="idcard"/> --> <one-to-one name="idcard" property-ref="person"/> </class> </hibernate-mapping>
多对多(teacher - student)
在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。
<set name="teacher" table="teacher_student">
<key column="teacher_id"/>
<many-to-many class="Student" column="student_id"/>
</set>
l
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.dzq.domain"> <class name="Student" table="student"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" column="name" /> <set name="teachers" table="teacher_student"> <key column="student_id"/> <many-to-many class="Teacher" column="teacher_id"/> </set> </class> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.dzq.domain"> <class name="Teacher" table="teacher"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" column="name" /> <set name="students" table="teacher_student"> <key column="teacher_id"/> <many-to-many class="Student" column="student_id"/> </set> </class> </hibernate-mapping>
package com.dzq.test; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import com.dzq.domain.Student; import com.dzq.domain.Teacher; import com.dzq.utils.HibernateUntils; public class ManyToMany { public static void main(String[] args) { add(); query(1); } public static void add(){ Session s=null; Transaction ts=null; try { Set<Teacher> tes=new HashSet<Teacher>(); Set<Student> stus=new HashSet<Student>(); s=HibernateUntils.getSession(); Teacher t1=new Teacher(); t1.setName("gao"); Teacher t2=new Teacher(); t2.setName("gaoji"); tes.add(t1); tes.add(t2); Student s1=new Student(); s1.setName("hu"); Student s2=new Student(); s2.setName("xiaohu"); stus.add(s1); stus.add(s2); t1.setStudents(stus); t2.setStudents(stus); /*s1.setTeachers(tes); s2.setTeachers(tes);*/ // 会报错,插入重复,要一个就行 ts=s.beginTransaction(); s.save(t1); s.save(t2); s.save(s1); s.save(s2); ts.commit(); } catch (Exception e) { if(ts!=null) ts.rollback(); throw new RuntimeException(e); }finally{ if(s!=null){ s.close(); } } } /** * 多对多查询,效率很低,用的比较少,最好使用分页查询,数据量很小才会使用,数据大量是会存在很严重的性能问题 * @param id */ public static void query(int id){ Session s=null; try { s=HibernateUntils.getSession(); Teacher teacher=(Teacher) s.get(Teacher.class, id); System.out.println(teacher.getStudents().size()); } finally{ if(s!=null){ s.close(); } } } }
组件映射(User-Name)
关联的属性是个复杂类型的持久化类,但不是实体即:数据库中没有表与该属性对应,但该类的属性要之久保存的。
<component name=”name” class=”com.test.hibernate.domain.Name”> <property name=”initial”/> <property name=”first”/> <property name=”last”/> </component>
当组件的属性不能和表中的字段简单对应的时候可以选择实现:
org.hibernate.usertype. UserType或
org.hibernate.usertype. CompositeUserType
package com.dzq.domain; public class Name { private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
只会产生一张表
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.dzq.domain"> <class name="User" table="user"> <id name="id" column="id"> <generator class="native" /> </id> <!-- <property name="username" column="username" /> --> <component name="username"> <property name="firstName" column="first_name"/> <property name="lastName" column="last_name"/> </component> <property name="password" column="password" /> <property name="mobile" column="mobile" /> <property name="regdate" column="regdate"/> </class> </hibernate-mapping>
关联关系的级联操作
package com.dzq.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.dzq.domain.Department;
import com.dzq.domain.Employee;
import com.dzq.utils.HibernateUntils;
public class ManyToOne {
public static void main(String[] args) {
add();
}
public static void addEmAndDe(){ Employee em=new Employee(); Department depart=new Department(); depart.setName("FBI"); em.setDepart(depart); em.setName("AK47"); HibernateUntils.add(depart); HibernateUntils.add(em); }
public static void add(){
Session s=null;
Transaction ts=null;
try {
Department dep=new Department();
dep.setName("FBI");
Employee e1=new Employee();
Employee e2=new Employee();
e1.setName("hi");
e1.setDepart(dep);
e2.setName("hello");
e2.setDepart(dep);
Set<Employee> empls=new HashSet<Employee>();
empls.add(e1);
empls.add(e2);
dep.setEmpls(empls);
s=HibernateUntils.getSession();
ts=s.beginTransaction();
//s.save(e1);
//s.save(e2);
s.save(dep);
ts.commit();
} catch (Exception e) {
ts.rollback();
throw new RuntimeException(e);
}finally{
if(s!=null){
s.close();
}
}
}
}
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.dzq.domain"> <class name="Department" table="department"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" column="name" /> <set name="empls" cascade="save-update"> <key column="depart_id"/> <one-to-many class="Employee"/> </set> <!-- <list name="empls"> <key column="depart_id"/> <list-index column="order_col"/> <one-to-many class="Employee"/> </list> --> <!-- <bag name="empls"> <key column="depart_id"/> <one-to-many class="Employee"/> </bag> --> </class> </hibernate-mapping>
相关文章推荐
- JSON数组不用字符串转换的写法
- 每天一个Linux命令(11)nl命令
- Ex2010-01 Difference Between Disabling and Removing a Mailbox
- MyBatis 入门(四)--存储过程
- [转载]12款很棒的浏览器兼容性测试工具推荐
- 个人最终总结
- web 前端 标签相关
- Java使用设计模式中的代理模式构建项目的实例展示
- 远程连接后无法看到本地电脑分区解决方法
- VoiceOver的使用
- JavaWeb中 Filter使用
- JQuery MiniUI学习笔记一
- 自定义控件圆形ImageView-复杂
- c#播放器
- java.lang.OutOfMemoryError: Java heap space
- tomcat8 配置过程 JRE_HOME错误等
- php 获取提交的数据 $_REQUEST = $_GET + $_POST + $_COOKIE
- ACK
- 80、SimpleDateFormat使用详解
- 通过一道笔试题浅谈javascript中的promise对象