1.联合主键映射
<?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="tarena.domain">
<class name="Person" table="person">
<!--联合主键的配置-->
<composite-id name="key" class="PersonKey">
<key-property name="first" type="string">
<column name="first"></column>
</key-property>
<key-property name="last" type="string">
<column name="last"></column>
</key-property>
</composite-id>
<property name="sex" type="string">
<column name="sex"></column>
</property>
</class>
</hibernate-mapping>
pojo类实现,要有equals()和hashCode()方法
package tarena.domain;
public class Person {
private PersonKey key;
private String sex;
public PersonKey getKey() {
return key;
}
public void setKey(PersonKey key) {
this.key = key;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((key == null) ? 0 : key.hashCode());
result = PRIME * result + ((sex == null) ? 0 : sex.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Person other = (Person) obj;
if (key == null) {
if (other.key != null)
return false;
} else if (!key.equals(other.key))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
}
}
PsersonKey类
package tarena.domain;
public class PersonKey implements java.io.Serializable{
private String first;
private String last;
public PersonKey(){}
public PersonKey(String first, String last) {
super();
this.first = first;
this.last = last;
}
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getLast() {
return last;
}
public void setLast(String last) {
this.last = last;
}
}
2.外键,多对一/一对多
<!--Dept.hbm.xml-->
<hibernate-mapping package="tarena.domain">
<class name="Dept" table="dept" lazy="true">
<id name="id" type="integer">
<column name="id"></column>
<!--id标识的生成策略,依赖于底层数据库的支持-->
<generator class="native"></generator>
</id>
<property name="dname" type="string">
<column name="dname"></column>
</property>
<!--cascade="all"表示表示对象表之间的级联关系;one-to-many中级联的对象应由多(many)的一方来提供支持,many-to-many中可以是任意方-->
<set name="emps" cascade="all" inverse="true">
<key column="dept_id"></key>
<one-to-many class="Emp"/>
</set>
</class>
<!--Emp.hbm.xml-->
<class name="Emp" table="emp">
<id name="id" type="integer">
<column name="id"></column>
<generator class="native"></generator>
</id>
<property name="ename" type="string">
<column name="ename"></column>
</property>
<!--class对应的级联表对象,fetch="join"表示表与表之间的抓取策略-->
<many-to-one name="dept" column="dept_id" class="Dept" fetch="join">
</many-to-one>
</class>
</hibernate-mapping>
测试类,具体实现在后面依次添加
public class DeptDAOTest {
DeptDAO deptDao;
@Before
public void init(){
deptDao = new DeptDAO();
}
// @Test
public void testAdd1(){
Dept dept = new Dept();
dept.setDname("testing");
deptDao.add(dept);
}
// @Test
//测试级联添加
public void testAdd2(){
Dept dept = new Dept();
dept.setDname("design");
//添加新员工designer1
Set<Emp> emps = new HashSet<Emp>();
Emp emp1 = new Emp();
emp1.setEname("designer1");
emp1.setDept(dept);
emps.add(emp1);
// 添加新员工designer2
Emp emp2 = new Emp();
emp2.setEname("designer2");
emp2.setDept(dept);
emps.add(emp2);
//将员工集合emps指定给dept对象
dept.setEmps(emps);
deptDao.add(dept);
}
@Test
//测试级联删除
public void testDelete(){
Dept dept = deptDao.findById(4);
deptDao.delete(dept);
}
// @Test
public void testFindById(){
Dept dept = deptDao.findById(1);
System.out.println(dept.getId()+":"+dept.getDname());
Set<Emp> emps = dept.getEmps();
for(Emp emp:emps){
System.out.println(emp.getId()+":"+emp.getEname());
}
System.out.println("一共有"+emps.size()+"个员工");
}
}
DeptDao代码
package tarena.dao;
import org.hibernate.Session;
import org.hibernate.Transaction;
import tarena.domain.Dept;
import tarena.util.HibernateUtil;
public class DeptDAO {
public Dept findById(int id){
Session session = HibernateUtil.getSession();
Dept dept = (Dept)session.load(Dept.class, id);
return dept;
}
public void add(Dept dept){
Session session = HibernateUtil.getSession();
Transaction txt = session.beginTransaction();
session.save(dept);
txt.commit();
HibernateUtil.closeSession();
}
public void delete(Dept dept){
Session session = HibernateUtil.getSession();
Transaction txt = session.beginTransaction();
session.delete(dept);
txt.commit();
HibernateUtil.closeSession();
}
}
3.理解延迟加载,区分load和get方法
//load方法启用延迟加载,返回的对象是一个代理对象
//Dept dept = (Dept)session.load(Dept.class, 1);
//get方法不启用延迟加载,立刻检索数据表,返回对象实例
Dept dept = (Dept)session.get(Dept.class, 1);
//HibernateUtil.closeSession();
// 如使用延迟加载,不要将session关闭,否则会影响后续取值操作
//可以在业务操作都完成后,再将session关闭。
//比如JavaWeb程序可以使用Filter控制session关闭
//hibernate的默认配置是启用延迟,所以在使用get方法时,
//可以Hibernate.initialize(obj),来对对象进行初始化加载,不过要在session.colse()之前
//或者可以把该对象的pojo类的映射文件的lazy="false",就可以了。
首先,配置hibernate.cfg.xml不过一般用于测试使用,项目开发可以使用第三方的管理配置
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="myeclipse.connection.profile">mysql</property>
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/hibernate
</property>
<!-- 是否使用数据库本地话方言 -->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- 是否打印hql语句 -->
<property name="show_sql">true</property>
<!-- 对象的关系映射 -->
<mapping resource="tarena/mapping/Person.hbm.xml" />
<mapping resource="tarena/mapping/Dept.hbm.xml" />
<mapping resource="tarena/mapping/Emp.hbm.xml" />
</session-factory>
</hibernate-configuration>
hibernateUtil的配置
package tarena.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
public static Configuration conf;
public static SessionFactory sf;
public static ThreadLocal<Session> sessionLocal = new ThreadLocal<Session>();
static{
conf = new Configuration();
conf.configure();//默认加载src下面的hibernate.cfg.xml配置文件
sf = conf.buildSessionFactory();
}
public static Session getSession() {
Session session = sessionLocal.get();
if(session == null){
session = sf.openSession();
sessionLocal.set(session);
}
return session;
}
public static void closeSession(){
Session session = sessionLocal.get();
sessionLocal.set(null);
if(session != null){
session.close();
}
}
}
pojo类Dept
package tarena.domain;
import java.io.Serializable;
import java.util.Set;
public class Dept implements Serializable{
private int id;
private String dname;
private Set<Emp> emps;
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Set<Emp> getEmps() {
return emps;
}
public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
}
分享到:
相关推荐
通过这个项目,初学者能够了解到如何在实际开发中应用级联关系,以及如何处理不同类型的关联。这不仅加深了对Hibernate的理解,也有助于提高数据库操作的效率,避免了许多手动维护关联关系的繁琐工作。因此,对于想...
在Hibernate中,级联操作(Cascading Operations)是一种高级特性,它使得对象之间的关联关系在数据库层面得以同步更新。当我们对一个实体对象进行操作时,可以设置级联属性,让这些操作自动传播到与之相关联的其他...
在Hibernate中,`@OneToOne`注解用于表示两个实体之间的唯一关系,通常需要配合`@JoinColumn`或`@PrimaryKeyJoinColumn`来指定关联字段。 2. **ManyToMany**:这个文件可能涉及多对多关联的讲解和实践。多对多关系...
实体Bean之间的级联关系是Java持久化框架如Hibernate或JPA中的一个重要概念,它涉及到对象关系映射(ORM)中的数据操作同步性。在数据库中,实体Bean通常代表表中的行,而实体间的级联关系则反映了表之间的关联。...
虽然描述部分为空,但根据给定的博文链接,我们可以推测文章可能详细解释了Hibernate中的级联查询概念,可能包括实际应用示例和源码解析。博主可能通过具体的例子展示了如何配置和使用级联查询,以及可能遇到的问题...
在Java持久化框架Hibernate中,一对多(One-to-Many)、多对一(Many-to-One)、级联(Cascading)、加载(Loading)和反转(Inversing)是关系映射的重要概念,它们对于理解如何在数据库和对象之间有效地管理关联至...
Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,级联(Cascade)是一种非常有用的功能,它能够帮助...
- 当两个或更多表之间存在关联时,例如一对多、多对一或多对多关系,级联操作会涉及到一个表的操作导致另一个表的相关数据也发生变化。例如,删除一个用户可能需要同时删除与之相关的所有订单。 - Hibernate等ORM...
在IT行业中,"三级联动"通常指的是在一个应用中,三个或更多下拉列表框之间存在联动关系,即一个下拉框的选择会影响到下一个下拉框的数据加载。这种技术常见于地域选择、产品分类等场景,提供了良好的用户体验。在这...
在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...
父类表和子类表之间没有直接的关系,但可以通过共享相同的属性字段来间接关联。 5. **查询和操作**:在使用这些类进行数据操作时,Hibernate会自动处理继承关系。你可以像操作普通实体一样操作这些继承类,例如,...
本篇文章将深入探讨 Hibernate 组件之间的关联机制及其应用。 **一对一关联(One-to-One)** 在一对一关联中,两个实体类之间存在唯一的关系,每个实体实例对应数据库中的一条记录。这种关联可以通过 @OneToOne ...
Struts2是一个MVC(Model-View-Controller)框架,它主要用于处理用户请求、控制业务逻辑和展示视图,而Hibernate则是一个对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表进行映射。 在这个...
在Java的Web开发中,Spring和Hibernate是两个非常重要的框架,Spring用于管理应用程序的依赖,而Hibernate则是一个对象关系映射(ORM)框架,用于处理数据库操作。本篇将深入探讨如何在Spring和Hibernate中实现多对...
2. **Hibernate**:Hibernate 是一个流行的对象关系映射(ORM)框架,它简化了 Java 应用程序与数据库之间的交互。通过 Hibernate,开发者可以用面向对象的方式操作数据,无需关心底层 SQL 语句。 3. **Spring**:...
这些表之间可能存在关联,例如,城市表的外键可能是省份表的主键,以此类推。通过这样的设计,可以轻松实现省市区的级联查询。 6. **页面交互**: 页面可能包含登录表单和级联选择框。登录表单通过Struts2的Action...
在教程中,你会学习如何使用Struts处理表单数据,如单选按钮、复选框和下拉列表,以及如何进行级联操作,比如在父表和子表之间进行关联更新。 3. Hibernate框架:Hibernate是一个对象关系映射(ORM)工具,它简化了...
在给出的例子中,有四个表:A、AA、B和BB,它们之间存在一对多(one-to-many)和一对一(one-to-one)的关系。例如,A表与AA表是一对多关系,而A表与B表是一对一关系,B表与BB表也是一对多关系。 在Hibernate的映射...
ORM的核心思想是将数据库中的表映射为Java类,字段映射为类的属性,而表之间的关系则通过类的关联关系来体现。这种映射使得我们可以用面向对象的方式来处理数据,提高了代码的可读性和可维护性。 3. **联表查询** ...