JPA继承关系,查子类得到的实体里没有父类的最新数据


我的JPA实现是用的EclipseJPA2。0
我有一个User类和一个Student类,Student是User的子类,用的是Join继承方式,即子类只包含子类的数据项。
关联字段是两个表的主键ID,区分类型字段是USER_TYPE。
User里有个isActive字段,
现在问题是这样的,前端有个用户验证是客户端程序,他验证好用户后会将isActive字段设置成Y.
用户从web页面登录的时候我会去通过用户名,密码,用户类型,是否有效查User表,这个时候对象是查到了,由于USER_TYPE是学生,所以这里实际上得到的是Studen对象,我强制转换到User对象。
但是我用查询到的对象取isActive的值时却是NULL,除非我重启服务,该对象得到的isActive才是Y
请问这个是什么原因?要怎么解决?

自己感觉像是事务问题,但又查的出对象,
再者是JPA取值没有去更新父类的数据,但要怎么设置才会让他更新呢?
貌似在配置了关系映射的对象里,获得映射对象的数据好像也有这个现象。

12 个解决方案

#1


有没有人知道阿

#2


你用的是单表继承吧,isActive是否Student类的专有属性?

#3


不是单表,是父类一张表,各个子类分别一张表,通过ID关联,isActive是User的。是共有属性

#4


如果你这样设计,是不需要区分字段USER_TYPE的,
还有Student类中是否重写了getIsActive()这个方法
我感觉是缓存的问题,你的客户端程序也是通过相同webserver验证的吗?如果不是的话,问题可能就在这里.

#5


补充说明下,把isActive的值改成Y的程序不是本系统的,是另外一个客户端程序,直接修改的数据库。而且就只有这样改的字段的值拿不到。
感觉就像JPA里还是使用的之前对象。

#6


可以确定是hibernate缓存的问题了,跟继承没有关系.
你把这个登陆查询单独使用jdbc查询吧.

#7


从jdbc底层的角度来说,使用的是TYPE_FORWORD_ONLY或TYPE_SCROLL_INSENSITIVE的ResultSet,而不是TYPE_SCROLL_SENSITIVE。所以通过外部对数据库的更改反应不到你的JPA中。这个我不知道JPA是否能设置这个ResultSet类型。但是使用TYPE_SCROLL_SENSITIVE会有性能问题,因为当每次在结果集移动光标时, 会重新获取该标识符的数据. 因为每次请求都会有往返, 性能可能会很慢。

ResultSet.TYPE_FORWORD_ONLY 结果集的游标只能向下滚动。

ResultSet.TYPE_SCROLL_INSENSITIVE 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。

ResultSet.TYPE_SCROLL_SENSITIVE 返回可滚动的结果集,当数据库变化时,当前结果集同步改变。

#8


如果楼主使用的是hibernate的query进行查询,也可以使用query.setCacheable(false)在此次查询中不使用缓存

#9


这个我了解了。谢谢大家
我就是有些不明白,如果不能反应到JPA中,为什么我用JPA查询的时候带isActive='Y'这个条件可以把这个数据查出来,只是对象的这个属性还是原来的值。

#10


最后还是JPA的缓存问题,我在配置里将User这个实体的缓存禁用就好了

#11


就是不知道,怎么样能够临时让其不去取缓存,而不是去禁用

#12


query.setCacheable(false)可以不

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com