`
sungang_1120
  • 浏览: 321665 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

hibernate关系映射多表间的CRUD、注解

阅读更多
package com.sg.domain;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_group")
public class Group {
private Integer id;
private String descs;

private Set<User> users =  new HashSet<User>();
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDescs() {
return descs;
}
public void setDescs(String descs) {
this.descs = descs;
}
@OneToMany(mappedBy="group",cascade={CascadeType.ALL},fetch=FetchType.EAGER)
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}

}

 

package com.sg.domain;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="t_user")
public class User {
private Integer id;
private String name;
private Group group;
@Id
@GeneratedValue
public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="groupId")
public Group getGroup() {
return group;
}

public void setGroup(Group group) {
this.group = group;
}

}

 

package com.sg.hibernate.Test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.sg.domain.Group;
import com.sg.domain.User;

public class TeacherTest {
private static SessionFactory sf = null;
@BeforeClass
public static void beforeClass(){
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
sf =  new AnnotationConfiguration().configure().buildSessionFactory();

}
@AfterClass 
public static void afterClass(){
sf.close();
}
@Test
public void testSaveUser(){
User u = new User();
u.setName("sungang");
Group g = new Group();
g.setDescs("nihao");

u.setGroup(g);

Session session = sf.getCurrentSession();
Transaction tr = session.beginTransaction();
//可以手动添加
//session.save(g);
//也可以靠级联关系
session.save(u);
tr.commit();


}
@Test
public void testSaveGroup(){
User u1 = new User();
u1.setName("u11");
User u2 = new User();
u2.setName("u22");

Group g = new Group();
g.setDescs("group1");
g.getUsers().add(u1);
g.getUsers().add(u2);
//
u1.setGroup(g);
u2.setGroup(g);

Session session = sf.getCurrentSession();
Transaction tr = session.beginTransaction();
//可以手动添加

//session.save(u1);
//session.save(u2);
//也可以靠级联关系
session.save(g);
tr.commit();


}
@Test
public void testGetUser(){
//取多的那一方  默认会把一的一方也取出来 不需要去配置级联关系
/**
*  select
        user0_.id as id2_1_,
        user0_.groupId as groupId2_1_,
        user0_.name as name2_1_,
        group1_.id as id3_0_,
        group1_.descs as descs3_0_ 
    from
        t_user user0_ 
    left outer join
        t_group group1_ 
            on user0_.groupId=group1_.id 
    where
        user0_.id=?
*/
testSaveGroup();
Session session = sf.getCurrentSession();
Transaction tr = session.beginTransaction();
User user = (User)session.get(User.class, 1);

System.out.println(user.getName());
System.out.println(user.getGroup().getId());

tr.commit();
}
@Test
public void testGetGroup(){
testSaveGroup();
//取一的那一方  默认不会把多的一方也取出来  就是有级联关系也不会取出
//要想取出来  需要配置fetch=FetchType.EAGER
/**
* select
        group0_.id as id3_1_,
        group0_.descs as descs3_1_,
        users1_.groupId as groupId3_,
        users1_.id as id3_,
        users1_.id as id2_0_,
        users1_.groupId as groupId2_0_,
        users1_.name as name2_0_ 
    from
        t_group group0_ 
    left outer join
        t_user users1_ 
            on group0_.id=users1_.groupId 
    where
        group0_.id=?
*/
Session session = sf.getCurrentSession();
Transaction tr = session.beginTransaction();
Group g = (Group) session.get(Group.class, 1);
for(User u : g.getUsers()){
System.out.println(u.getName()+"======");
}

}
@Test
public void testUpdateUser(){
//更新多的一方 会相应的可以把一的一方也更新  不需配置级联就可以
testSaveGroup();
Session session = sf.getCurrentSession();
Transaction tr = session.beginTransaction();
User user = (User)session.get(User.class, 1);
user.setName("user");
user.getGroup().setDescs("descs");
session.update(user);
tr.commit();
}
@Test
public void testUpdateUser2(){
//更新多的一方  在游离状态更新   要想更新一的一方  需要配置级联ALL
testSaveGroup();
Session session = sf.getCurrentSession();
Transaction tr = session.beginTransaction();
User user = (User)session.get(User.class, 1);
tr.commit();

user.setName("user1");
user.getGroup().setDescs("descs1");

Session session2 = sf.getCurrentSession();
Transaction tr2 = session2.beginTransaction();
session2.update(user);
tr2.commit();

}
@Test
public void testDeleteUser(){
//
testSaveGroup();
Session session = sf.getCurrentSession();
Transaction tr = session.beginTransaction();
User user = (User)session.load(User.class, 1);
//先结束关联关系
//user.setGroup(null);
//session.delete(user);
//也可以直接hql
session.createQuery("delete User u where u.id=1").executeUpdate();
tr.commit();
}
@Test
public void testDeleteGroup(){
//
testSaveGroup();
Session session = sf.getCurrentSession();
Transaction tr = session.beginTransaction();
Group g = (Group)session.load(Group.class, 1);
//先结束关联关系
//user.setGroup(null);
//session.delete(user);
//也可以直接hql
//session.createQuery("delete User u where u.id=1").executeUpdate();
//取出所有的user  并把之间的关系全部解除
//for(User user : g.getUsers()){
//user.setGroup(null);
//}
session.createQuery("delete Group g where g.id = 1").executeUpdate();
//session.delete(g);
tr.commit();
}
@Test 
public void testExport(){
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}
}
 

 

分享到:
评论

相关推荐

    Hibernate关联关系的CRUD和集合映射(annotation)

    本文将深入探讨Hibernate中的关联关系、CRUD操作以及集合映射(基于注解的方式)。关联关系是数据库设计中的核心概念,而Hibernate通过注解使得这种关系在代码中得以体现,简化了开发工作。 ### Hibernate关联关系 ...

    Hibernate高级映射实例

    在Hibernate中,映射是将对象模型与关系数据库之间的桥梁,通过XML配置文件或注解,我们可以定义对象与表之间的关系,以便于对象的CRUD(创建、读取、更新、删除)操作对应到数据库的SQL操作。 1. **单向一对一映射...

    Hibernate多对一映射(注解版)

    本教程将重点讲解如何在Hibernate中实现多对一的映射关系,采用的是注解方式进行配置。 **一、多对一关系** 在数据库设计中,多对一关系表示一个实体可以与另一个实体的多个实例相关联。例如,一个部门可以有多名...

    Hibernate初之单表映射学习例子

    10. **实体关系映射**:虽然标题提到“单表映射”,但可以扩展讨论到多对一、一对多、多对多等关联关系的映射。 通过这个“Hibernate初之单表映射学习例子”,初学者可以掌握Hibernate的基本操作,为进一步深入学习...

    hibernate对象关系映射实例

    3. **映射文件**:使用`hibernate-mapping`标签定义,或者使用Java注解,描述实体类与数据库表之间的映射规则。 4. **SessionFactory和Session接口**:SessionFactory是线程安全的,用于创建Session实例。Session是...

    hibernate双向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

    Hibernate实体映射

    在Java类上使用特定的Hibernate注解可以声明实体类及其属性与数据库表的对应关系。例如,`@Entity`注解标识一个类为Hibernate实体,`@Table`指定对应的数据库表名,`@Id`标记主键字段,`@GeneratedValue`定义主键...

    struts2与hibernate的整合实现数据的crud

    4. **创建实体类**:根据数据库表结构,创建对应的Java实体类,并使用Hibernate的注解进行ORM(对象关系映射)配置。 5. **DAO层设计**:创建Hibernate的Data Access Object(DAO)接口和实现类,这里包含对数据库...

    Hibernate Part 2:单表CRUD

    在Java企业级开发中,对象关系映射(Object-Relational Mapping,ORM)框架如Hibernate极大地简化了数据库操作,使得开发者可以更专注于业务逻辑,而不是繁琐的数据访问代码。本篇将深入探讨Hibernate如何实现单表的...

    Hibernate映射实例

    确保数据库与Hibernate映射文件一致,能正确地反映实体之间的关系。导入DBO到SQL Server数据库后,就可以通过Hibernate的Session接口进行CRUD(创建、读取、更新、删除)操作了。 在开发过程中,理解并熟练运用这些...

    hibernate反向生成实体类及CRUD操作教学视频

    4. **生成持久化代码**: 反向工程还会生成基于这些实体的Hibernate配置文件(hbm.xml或使用注解的方式),定义了表与类之间的映射关系。 接下来,视频会涵盖CRUD(创建、读取、更新、删除)操作,这是任何数据库...

    HIBERNATE:Hibernate 学习一--注解方式自动建表

    在Hibernate中,注解用于将Java类与数据库表关联,以及将类的属性与表的列对应起来,从而实现了对象关系映射(ORM)。 1. **实体类注解**: - `@Entity`:标记一个Java类为数据库中的一个实体表,相当于传统的...

    struts+HIbernate增删改查(CRUD)

    Hibernate通过XML配置文件(hibernate.cfg.xml)定义数据库连接参数,并在实体类(Entity Class)上使用注解或XML映射文件(hbm.xml)来指定与数据库表的对应关系。SessionFactory是Hibernate的主要入口点,用于创建...

    Hibernate注解配置表映射实例

    在这个“Hibernate注解配置表映射实例”中,我们将深入探讨如何使用Hibernate的注解来配置实体类与数据库表之间的映射。 Hibernate注解提供了在Java类和类属性上直接定义数据库映射的能力,避免了XML配置文件的繁琐...

    Hibernate关联映射.rar

    本教程“Hibernate关联映射.rar”聚焦于Hibernate中的关联映射,特别是多对一和一对多的关系映射,非常适合初学者了解和实践。 首先,我们要理解什么是关联映射。在数据库中,表与表之间存在各种关系,如一对一、一...

    Hibernate映射集合属性List

    本文将详细探讨如何使用Hibernate映射集合属性List,以及如何让Hibernate自动创建对应的数据库表,无需手动编写SQL语句。 首先,我们需要理解Hibernate的映射机制。Hibernate通过ORM(对象关系映射)技术将Java对象...

    hibernate(一对多,多对一映射)操作

    本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一个实际的demo演示它们在增删查改操作中的应用。 首先,我们要理解什么是数据库的关联关系。在数据库设计中,我们经常遇到一种情况,即一个实体可能与...

    hibernate 多对多映射实例,学生 选课

    在这个“hibernate 多对多映射实例,学生 选课”项目中,我们将探讨如何使用Hibernate处理多对多关系,以及如何构建一个学生选课的系统。 首先,我们要理解多对多关系。在现实生活中,学生和课程之间就是一个典型的...

    Hibernate基本增删改CRUD操作

    在Java开发中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者无需直接编写SQL语句,就能实现对象与关系数据库之间的映射。本教程将深入讲解如何使用Hibernate进行基本的创建(Create)、...

    hibernate 一对多多对一的映射

    Hibernate是一个开源的ORM框架,它通过XML配置文件或者注解将Java对象映射到关系数据库表,实现了对象与关系数据之间的转换。这使得开发者可以使用面向对象的方式来操作数据库,降低了数据库操作的复杂性。 ### 二...

Global site tag (gtag.js) - Google Analytics