代码之家  ›  专栏  ›  技术社区  ›  Allloush

@事务性不使用HQL或SQL更新记录

  •  1
  • Allloush  · 技术社区  · 7 年前

    我使用事务性注释是为了在Oracle DB中启用自动提交。

    当我使用条件更新记录时,我成功地更新了记录。但是当我使用HQL或SQL时,在控制台中会打印查询,但不会执行

    这是通知DAO

    @Repository("SystemUserNotificationDao")
    public class SystemUserNotificationDaoImpl extends AbstractDao<BigDecimal, SystemUserNotification> implements SystemUserNotificationDao {
    
        @Override
        public Number setNotificationsAsSeen() {
            Query query = createHqlQuery("update SystemUserNotification set seen = 1 where seen = 0");
            return (Number)query.executeUpdate();
        }
    
    }
    

    这就是服务

    Service("SystemUserNotificationService")
    @Transactional
    public class SystemUserNotificationServiceImpl implements SystemUserNotificationService {
    
        @Autowired
        SystemUserNotificationDao systemUserNotificationDao;
    
        @Override
        public Number setNotificationsAsSeen() {
            return systemUserNotificationDao.setNotificationsAsSeen();
        }
    }
    

    这是抽象道

        public abstract class AbstractDao<PK extends Serializable, T> {
    
        private final Class<T> persistentClass;
    
        @SuppressWarnings("unchecked")
        public AbstractDao() {
            this.persistentClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
        }
    
        @Autowired
        private SessionFactory sessionFactory;
    
        protected Session getSession() {
            return sessionFactory.getCurrentSession();
        }
    
        @SuppressWarnings("unchecked")
        public T getByKey(PK key) {
            return (T) getSession().get(persistentClass, key);
        }
    
        public void persist(T entity) {
            getSession().persist(entity);
        }
    
        public void update(T entity) {
            getSession().update(entity);
        }
    
        public void saveOrUpdate(T entity) {
            getSession().saveOrUpdate(entity);
        }
    
        public void delete(T entity) {
            getSession().delete(entity);
        }
    
        protected Criteria createEntityCriteria() {
            return getSession().createCriteria(persistentClass);
        }
    
        protected SQLQuery createSqlQuery(String query) {
            return getSession().createSQLQuery(query);
        }
    
        protected Query createHqlQuery(String query) {
            return getSession().createQuery(query);
        }
    }
    

    我尝试添加事务。begin和commit,但它提供了不支持的嵌套事务

        @Override
        public Number setNotificationsAsSeen() {
    //        Query query = createHqlQuery("update SystemUserNotification set seen = 1 where seen = 0");
            Transaction tx = getSession().beginTransaction();
            Query query = getSession().createQuery("update SystemUserNotification set seen = 1 where seen = 0");
            Number n = (Number)query.executeUpdate();
            tx.commit();
            return n;
        }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Allloush    7 年前

    问题在于SQL开发人员工具。有未提交的更改,我关闭了开发工具,更新查询工作正常