设为首页 加入收藏

TOP

Hibernate中关联关系的CRUD(增删改查)(四)
2015-07-24 11:09:58 来源: 作者: 【 】 浏览:3
Tags:Hibernate 关联 关系 CRUD 删改
d as id1_1_2_, users1_.group_id as group_id3_1_2_, users1_.name as name2_1_2_ from t_group group0_ left outer join t_user users1_ on group0_.id=users1_.group_id where group0_.id=?

(3)@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER的时候,先取出的是关系,然后取出的是User

Hibernate: select user0_.id as id1_1_0_, user0_.group_id as group_id3_1_0_, user0_.name as name2_1_0_, group1_.id as id1_0_1_, group1_.name as name2_0_1_ from t_user user0_ left outer join t_group group1_ on user0_.group_id=group1_.id where user0_.id=?

Hibernate: select users0_.group_id as group_id3_0_0_, users0_.id as id1_1_0_, users0_.id as id1_1_1_, users0_.group_id as group_id3_1_1_, users0_.name as name2_1_1_ from t_user users0_ where users0_.group_id=?

(4)两边都设置EAGER的时候,会发出两次select语句。所以,一般是在一遍设置EAGER就可以了。

?

?

三、更新数据

1.cascade={CascadeType.ALL}的时候,默认会级联。因此在修改User属性的时候,会修改Group的属性。例如:

@Test

public void testUpdateUser() {

testSaveGroup();

Session s = sf.openSession();

s.beginTransaction();

User u = (User)s.load(User.class, 1);

u.setName("user");

u.getGroup().setName("ggg");

s.getTransaction().commit();

?

}

此处修改了Group的name属性,因此,在更新User对象的时候,会更新Group对象的属性。

如下SQL语句说明了以上观点:

Hibernate: update t_user set group_id=?, name=? where id=?

Hibernate: update t_group set name=? where id=?

2.在User.java中,配置cascade={CascadeType.MERGE},此时在JUnit中,使用merge()方法后,将会产生级联,即只保存User对象的情况下,会自动保存Group对象。使用merge()来合并两个session中的同一对象。

以下是JUnit中的测试方法

@Test

public void testUpdateUser() {

testSaveGroup();

Session s = sf.getCurrentSession();

s.beginTransaction();

User u = (User)s.get(User.class, 1);

s.getTransaction().commit();

?

u.setName("u");

u.getGroup().setName("g");

?

Session s2 = sf.getCurrentSession();

s2.beginTransaction();

s2.merge(u);

s2.getTransaction().commit();

}

?

同理,设置cascade的值的时候,在session中使用对应的方法将可以实现级联操作。

?

?

四、删除数据

1、ORMapping编程模型:

|映射模型

|以Hibernate为例

|jpa annotation

|Hibernate annotation extension

|Hibernate xml

|jpa xml

|接口编程

|jpa编程接口

|Hibernate

2、@Test

public void testDeleteUser() {

testSaveGroup();

Session s = sf.openSession();

s.beginTransaction();

User u = (User)s.load(User.class, 1);

s.delete(u);

s.getTransaction().commit();

?

}

如下的测试方法会删除User和Group中的所有数据。原因是因为两者是级联关系。User.java中设置的@ManyToOne(cascade={CascadeType.ALL},Group.java中设置的是@OneToMany(mappedBy="group",

cascade={CascadeType.ALL},所以删除User的时候会关联到该User对象的Group属性,从而删除该Group属性,而Group属性又关联了User属性,所以又会删除User的内容,从而导致了删除了两张表中的全部内容。

3.解决如上的问题的方法是消除关联关系,再进行删除。

@Test

public void testDeleteUser() {

testSaveGroup();

Session s = sf.openSession();

s.beginTransaction();

User u = (User)s.load(User.class, 1);

u.setGroup(null);

s.delete(u);

s.getTransaction().commit();

?

}

查看生成的SQL语句:

Hibernate: delete from t_user where id=?

?

?

还有一种方式就是使用HQL语句:

s.createQuery("delete from User where u.id = 1").executeUpdate();

也可以达到效果。

4.想要消除关联关系,先设定关系为null,在删除对应的记录。如果不删除记录,那么该记录就会变为垃圾数据。

?

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇【MongoDB数据库】JavaMongoDBCRU.. 下一篇Chapter3ProtectingtheData(2)..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Java 学习线路图是怎 (2025-12-25 15:19:15)
·关于 Java 学习,有 (2025-12-25 15:19:12)
·有没有Java swing教 (2025-12-25 15:19:09)
·Start, Stop, and Di (2025-12-25 14:50:57)
·C语言入门教程:零基 (2025-12-25 14:50:54)