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);
}
}