文档章节

用了这么久的hibernate 今天发现我还有这些问题太明白?

zhaoyou
 zhaoyou
发布于 2010/07/27 13:31
字数 528
阅读 927
收藏 1

今天遇到一个问题、不知道是不是我这样理解的,但是用hibernate我还是显得那么外行!

1.下面是两个测试的实体Role 和Student(只列出了字段其他都省略)

 

public class Role implements java.io.Serializable{
	
	private Integer id  ;
	private String name ;
}
public class Student implements java.io.Serializable{
	
	private Integer id ;
	private String name ;
	private Integer age ;
	
	private Role role ;
}
String name  = request.getParameter("name") ;
String age = request.getParameter("age") ;
		Student stu = new Student();
		stu.setName(name);
		stu.setAge(new Integer(age));
		Role role = new Role();
		role.setId(2);
	//	role.setName("why?");
		stu.setRole(role);
		this.studentBiz.addStudet(stu);
		request.setAttribute("list", this.studentBiz.getAll());
		return mapping.findForward("list") ;

 

上面这段是action的关键代码。保存一个sutdent,实例化一个role对象。设置sutdent的属性。然后在把所有的student查询出来。问题出来了。//role.setName("why?")不设置。默认引用标识为2的角色。但最终显示的页面,显示的名称,并不是数据库中的roleName,而是空。

这是jsp页面代码

 

<c:forEach var="s" items="${list}">
   	id:${s.id}	name:${s.name } age :${s.age}  roleName: ${s.role.name }<br/>
   </c:forEach>

 

 

下面说明一下我的程序配置:

1.struts+hibernate+spring 集成、session的开启方式是 OpenSessionInViewFilter.

2.我在action设置roleName是什么,页面就是显示什么。不管你roleId引用的数据库RoleName 是什么。当然如果你不直接实例化Role对象,而是从数据库中直接加载出来。在保存Student是完全没有问题的。我本人是想提高性能,不想保存一个student还要去查role.因为roleId在页面上可以获取到。

3.我个人分析是session缓存在那里。虽然保存进去成功了(应为能够获取student的生成的标识)。同时也可以看到执行了查询语句。但是显示的时候,hibernate可能做了某种处理。直接从缓存里拿,没有从结果里面拿,所以最新添加的roleName就是为空(因为添加的时候没有设置),其他的还是引用的数据库中的RoleName。

请大家说说自己的看法。或着我真的哪里错了。

(红薯大哥瞧瞧了)

© 著作权归作者所有

共有 人打赏支持
zhaoyou
粉丝 14
博文 16
码字总数 2043
作品 0
上海
项目经理
私信 提问
加载中

评论(5)

cwledit
cwledit
我觉得在ADD完之后session中还是的STU对象应该先flush掉,
因为你开启了openSessionInView,所以这个对象在重新查询出来的时候还是拿的老的对象。
单相思
那是因为role没有级联保存?
hans汉斯
hans汉斯
真晕,自己实例化了一次,还说hibernate的问题,好好看自己的代码吧
s
sheniyilian
费半天劲注册 什么懒加载 和那有关系么 楼上的 看清楚了再说 那他哥对象是新势力化的 set什么就有什么数据 若是想同步数据库数据 得查询好不 用着个对象接受之后 在关系映射上 在查询时才有是否懒加载 那个是配置文件的说 哎。。。浪费时间
花落重来
花落重来
这是hibernate的懒加载机制导致的, 一般hibernate加载一个对象的时候只会加载它的基本数据类型的属性和基本类型的包装类类型的属性, 不会加载那些自定义类型的属性.默认会返回一个代理对象,在你是用的时候才会去加载数据. 你这个貌似覆盖了属性修改了代理对象
[Hibernate]关于ID的一个容易混淆的地方

用了这么久的Hibernate了,今天却遇到一个从未遇到的问题,幸好我思维敏捷,善于联想,才得以在短时间内发现并解决了问题。以下是具体描述。 我在HibernateDAO这个类里增加了一个方法如下: ...

青夜之衫
2017/12/06
0
0
Hibernate的dao层排错

环境搭建成功后就进入了Hibernate的dao层的修改,将之前的使用MySQL的dao层修改成使用hibernate的dao层。一开始我是和之前使用了UserDao类、UserDaoImpl类、UserDaoProxy类一起构建了dao层,...

一梦心草
2015/05/19
0
0
JSP+DAO实现数据库的CRUD

今天在看李兴华《JavaWeb实战经典》时候,看到了用JSP+DAO整合起来做了一个数据库的增删改查操作。程序不难,但是具备借鉴意义。一般来说javaweb项目主要操作就是操作数据库,其本质也就是操...

HappyBoyLi
2016/04/06
0
0
告别框架崇拜

挣扎了一天之后,我决定放弃hibernate,仅仅使用struts2来完成我的项目,无关hibernate本身,因为我不得不承认以我现在的水平,真心驾驭不了hibernate。 其实我此前无任何ssh开发的经验,所以...

我要活出个人模狗样
2017/11/30
0
1
求javaWeb大神们戳入,有一些Hibernate上面的疑惑~

我有一个朋友,他在做一个项目,上次让我做一个模块,把源码发给我了,他是用SSH做的,可是在Hibernate里面用了很多的SQL语句,大多是连表查询,可是我个人感觉很多地方用hql语句貌似更方便些...

上帝爱众生
2015/04/18
65
1

没有更多内容

加载失败,请刷新页面

加载更多

5、redis分布式锁

参考链接:https://www.cnblogs.com/linjiqin/p/8003838.html 一:介绍 实现分布式锁有三种方式:1、数据库乐观锁,2、基于redis,3、基于zookeeper。 redis服务端是单线程操作,完美地避免了...

刘付kin
19分钟前
3
0
OSChina 周日乱弹 —— 我重新说

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享矢野立美的单曲《LOVE Theme from TIGA <M-2>》: 《LOVE Theme from TIGA <M-2>》- 矢野立美 手机党少年们想听歌,请使劲儿戳...

小小编辑
今天
56
5
Java单例模式学习记录

在项目开发中经常能遇见的设计模式就是单例模式了,而实现的方式最常见的有两种:饿汉和饱汉(懒汉)。由于日常接触较多而研究的不够深入,导致面试的时候被询问到后有点没底,这里记录一下学习...

JerryLin123
昨天
10
0
VSCODE 无法调试

VSCODE 无法调试 可以运行 可能的原因: GCC 的参数忘了加 -g

shzwork
昨天
5
0
理解去中心化 稳定币 DAI

随着摩根大通推出JPM Coin 稳定币,可以预见稳定币将成为区块链落地的一大助推器。 坦白来讲,对于一个程序员的我来讲(不懂一点专业经济和金融),理解DAI的机制,真的有一点复杂。耐心看完...

Tiny熊
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部