Hibernate session.get返回null

时间:2015-12-15 16:54:20

标签: hibernate

这是我的完整类,它有两个方法,一个用于插入,另一个用于更新。插入方法已成功插入,我可以看到表中的记录,但在update方法中获取,尽管表中存在数据记录,但仍返回null。

@Repository
@Transactional
public class MyApplicationDAOImpl implements MyApplicationDAO {

    @Autowired
    private SessionFactory sessionFactory;

    // Insert Method            
    public boolean insertUpdateMyData(Long Key,String message)throws Exception {

        Session session = sessionFactory.getCurrentSession();
        MyData data = new MyData();
        data.setKey(Key);
        data.setMessage(message);
        session.saveOrUpdate(data);
        return true;
    }

    //This is update method     
    @Override
    @Transactional(isolation = Isolation.SERIALIZABLE,propagation = Propagation.REQUIRES_NEW)
    public boolean updateMyData(Long Key,
            String new_message)throws Exception {

        Session session = sessionFactory.getCurrentSession();
        MyData data = (MyData) session.get(MyData.class,Key,LockMode.UPGRADE);
        if(data != null)
        {
            data.setMessage(new_message);
            sessionFactory.getCurrentSession().update(data);
            session.flush();
            return true;
        }
        else
        {
            session.flush();
            return false;
        }   

    }
}

1 个答案:

答案 0 :(得分:0)

鉴于insertUpdateMyData上没有@Transactional,我只假设您有一些顶级方法,如...

@Transactional
public void upperLevelMethod() {
    Key key = getKeyFromSomewhere();
    String message = getMessageFromSomewhere();
    insertUpdateMyData(key, message);
    String newMessage = getNewMessageFromSomewhere();
    updateMyData(key, newMessage);
}

upperLevelMethod将创建一个insertUpdateMyData将继承的交易(交易A),然后updateMyData将创建一个全新的交易(因为您有requires_new,我们称之为交易B)。由于事务A在事务B启动时未提交,事务B具有序列化级别隔离,这意味着事务B不会看到事务A所做的任何更改。

您需要在调用insertUpdateMyData之前提交updateMyData使用的事务,或者更改updateMyData以继承相同的事务。