为什么session用get取数据库的数据为null(数据库绝对有数据)

颖辉小居 发布于 2016/06/01 20:55
阅读 780
收藏 1

dao层这样写的

@Override
    public T get(ID id) {
        T t = (T) this.getSession().get(getEntityClass(), id);
        return t;
    }


public Session getSession() {
        //sessionFactory.getCurrentSession()方法是从线程池中获取数据库session的方法。需要开启事物,才能得到CurrentSession,会在事物回滚或提交时自动关闭
        return sessionFactory.getCurrentSession();
    }

获得一个Police police对象,这个对象有属性Task currTask,他们是一对一单向关联关系。 常常得到的 curr Task=null(数据库里有对应数据,有的时候可以得到)。

package com.safe.model;


import java.util.Date;


import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;


import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;


/**
 * 警察
 * 
 * @author Administrator
 * 
 */
@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Police extends AbstractModel {
 private static final long serialVersionUID = 1L;
 private int id;
 private String policeNo;
 private transient String pwd;
 private transient String token;
 private int loginCount = 0;// 登陆次数


 private PoliceDetails details;// 详细信息
 private Coord coord;// 坐标
 // @Expose
 private Task currTask;// 当前任务
 private boolean onLine = false;// 在线状态
 private Date lastLoginTime;// 最后登录时间


 public Police() {
 super();
 }


 public Police(String policeNo, String pwd, PoliceDetails details, Coord coord) {
 super();
 this.policeNo = policeNo;
 this.pwd = pwd;
 this.details = details;
 this.coord = coord;
 }


 @Id
 @GeneratedValue
 public int getId() {
 return id;
 }


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


 public String getPoliceNo() {
 return policeNo;
 }


 public void setPoliceNo(String pliceNo) {
 this.policeNo = pliceNo;
 }


 public String getPwd() {
 return pwd;
 }


 public void setPwd(String pwd) {
 this.pwd = pwd;
 }


 public String getToken() {
 return token;
 }


 public void setToken(String token) {
 this.token = token;
 }


 @OneToOne(cascade = { CascadeType.ALL })
 public PoliceDetails getDetails() {
 return details;
 }


 public void setDetails(PoliceDetails details) {
 this.details = details;
 }


 @OneToOne(cascade = { CascadeType.ALL })
 public Coord getCoord() {
 return coord;
 }


 public void setCoord(Coord coord) {
 this.coord = coord;
 }


 @OneToOne(cascade = { CascadeType.ALL })
 public Task getCurrTask() {
 return currTask;
 }


 public void setCurrTask(Task currTask) {
 this.currTask = currTask;
 }


 public boolean isOnLine() {
 return onLine;
 }


 public void setOnLine(boolean onLine) {
 this.onLine = onLine;
 }


 public int getLoginCount() {
 return loginCount;
 }


 public void setLoginCount(int loginCount) {
 this.loginCount = loginCount;
 }


 public Date getLastLoginTime() {
 return lastLoginTime;
 }


 public void setLastLoginTime(Date lastLoginTime) {
 this.lastLoginTime = lastLoginTime;
 }


 @Override
 public String toString() {
 return "Police [id=" + id + ", policeNo=" + policeNo + ", loginCount=" + loginCount +
 ", details=" + details
 + ", coord=" + coord.toString() +
 ", currTask=" + (currTask==null?null:currTask.toString()) + ", onLine=" + onLine + ", lastLoginTime="
 + lastLoginTime + "]";
 }


}

打印police内容为:police=Police [id=2, policeNo=8888, loginCount=13, details=com.safe.model.PoliceDetails@7da7689d, coord=Coord [id=5, x=114.90369, y=40.784523], currTask=null, onLine=true, lastLoginTime=Wed Jun 01 20:31:31 CST 2016]

数据库里currTask 是有数据的,其他引用类型属性就可以查询到,只有这个currTask 总是为null



非常急,搞了一天没找到原因

加载中
0
颖辉小居
颖辉小居

找到大体的原因,因为项目使用了spring框架 用了ApplicationContext,ApplicationContext管理了SessionFactory和session,某一次从数据库获得数据,currTask是null,我用用单元测试(另外一个ApplicationContext管理的session)指派任务给警员直接修改了数据库,警员的数据变了有了currTask。第一个session不知道数据变了,查询的时候就在缓存里拿的数据,不去查询数据库,所以currTask是空。

造成以上问题的主要原因的是直接修改数据库,而缓存是被hibernate管理的,间接被spring容器管理。造成缓存与实际数据不一致。解决办法还没有想到。

0
Java_Coder
Java_Coder
设计数据库的时候currTask_id 有没有设置外键关联。。。
颖辉小居
颖辉小居
hibernate会自动关联和创建表的
0
颖辉小居
颖辉小居
自己顶 着急啊
0
颖辉小居
颖辉小居
还是没有解决啊。在线等,发现单元测试就可以取出来,通过struts2 action请求调用service就不能取出这个task属性。单元测试和action获取的service 不是同一个ApplicationContext。可是action可以获得police的其他引用属性。真的就找不到原因。两天了,拜托了大神
0
skhuhu
skhuhu
用load ··缓存拿不到 他就去查了
返回顶部
顶部