有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java处理hibernate/DAO问题

大家好这里是我的道课:

public class UsersDAO extends HibernateDaoSupport {

    private static final Log log = LogFactory.getLog(UsersDAO.class);

    protected void initDao() {
        //do nothing
    }

    public void save(User transientInstance) {
        log.debug("saving Users instance");
        try {
            getHibernateTemplate().saveOrUpdate(transientInstance);
            log.debug("save successful");
        } catch (RuntimeException re) {
            log.error("save failed", re);
            throw re;
        }
    }

public void update(User transientInstance) {
        log.debug("updating User instance");
        try {
            getHibernateTemplate().update(transientInstance);
            log.debug("update successful");
        } catch (RuntimeException re) {
            log.error("update failed", re);
            throw re;
        }
    }

    public void delete(User persistentInstance) {
        log.debug("deleting Users instance");
        try {
            getHibernateTemplate().delete(persistentInstance);
            log.debug("delete successful");
        } catch (RuntimeException re) {
            log.error("delete failed", re);
            throw re;
        }
    }

    public User findById( java.lang.Integer id) {
        log.debug("getting Users instance with id: " + id);
        try {
            User instance = (User) getHibernateTemplate()
                    .get("project.hibernate.Users", id);
            return instance;
        } catch (RuntimeException re) {
            log.error("get failed", re);
            throw re;
        }
    }

}

现在,我编写了一个测试类(不是junit测试)来测试一切是否正常,我的用户在数据库中有以下字段:userID是5个字符的长字符串和唯一/主键,以及address、dob等字段(数据库表中总共有15列)。现在,在我的测试课上,我在一个声明用户中添加了如下值:

User user = new User;
user.setAddress("some address");

所以我对所有15个字段都做了,而不是在将数据分配给用户对象的最后,我调用DAO将其保存到数据库UsersDao.save(user);,并完美地保存工作我的问题是如何使用相同的逻辑更新/删除用户

Fox示例我尝试了以下方法(从表用户中删除用户):

User user = new User;
user.setUserID("1s54f"); // which is unique key for users no two keys are the same
UsersDao.delete(user); 

我想用这个密钥删除用户,但它明显不同。有人能解释一下怎么做吗。谢谢!

更新:

我是否需要设置用户对象上的所有15个字段来删除它,就像我使用save方法一样


共 (3) 个答案

  1. # 1 楼答案

    在理想情况下,您将使用模型的业务密钥作为数据库主键,而不会出现此问题。但事实并非如此,不是吗

    对于您的特定问题如果您非常确定用户ID将是唯一的,那么您可以尝试以下方法(取自here):

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    
    String hqlDelete = "delete User u where u.userID = :id";
    
    int deletedEntities = s.createQuery( hqlDelete )
            .setString( "id", userID )
            .executeUpdate();
    tx.commit();
    session.close();
    

    但我要警告你。这种代码一点也不好。例如,如果将来决定删除中使用的列不再是唯一的,会发生什么?然后你会遇到一个非常严重的bug或者一个非常糟糕的重构案例。不管是哪种方式,傻瓜式(可能不高效,也可能不可行)的方法是根据记录的主键删除记录

  2. # 2 楼答案

    由于很长一段时间没有研究Hibernate,我只能对这个问题进行猜测

    看起来您正在创建一个用户对象,但只填充用户ID字段,所以持久层对实际用户一无所知

    我建议使用一个检索函数,可以找到具有给定ID的用户,然后将该用户传递到delete方法中

    User u = UsersDao.findById("1s54f");
    UsersDao.delete(u);
    

    这应该是可行的,因为持久层将了解用户,所以它拥有执行删除所需的所有细节

    然而,更有效的方法是找到一种按ID删除用户的方法,这样就不必查询数据库来获取用户的实例,然后将其删除

    希望这有帮助

    克里斯

  3. # 3 楼答案

    为了删除ID为“1s54f”的用户,您应该创建一个delete HQL,如下所示:

    public void delete(String id) {
            log.debug("deleting Users instance");
            try {
                final String deleteQuery = "delete from User where id = :id";
                final Query query = getSession().createQuery(deleteQuery);
                final query.setString("id",id);
                final int rowCount = query.executeUpdate(); // check that the rowCount is 1
                log.debug("delete successful");
            } catch (RuntimeException re) {
                log.error("delete failed", re);
                throw re;
            }
     }
    

    然后您可以使用以下方法:

    userDao.delete("1s54f");
    

    希望这有帮助