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方法一样
# 1 楼答案
在理想情况下,您将使用模型的业务密钥作为数据库主键,而不会出现此问题。但事实并非如此,不是吗
对于您的特定问题如果您非常确定用户ID将是唯一的,那么您可以尝试以下方法(取自here):
但我要警告你。这种代码一点也不好。例如,如果将来决定删除中使用的列不再是唯一的,会发生什么?然后你会遇到一个非常严重的bug或者一个非常糟糕的重构案例。不管是哪种方式,傻瓜式(可能不高效,也可能不可行)的方法是根据记录的主键删除记录
# 2 楼答案
由于很长一段时间没有研究Hibernate,我只能对这个问题进行猜测
看起来您正在创建一个用户对象,但只填充用户ID字段,所以持久层对实际用户一无所知
我建议使用一个检索函数,可以找到具有给定ID的用户,然后将该用户传递到delete方法中
这应该是可行的,因为持久层将了解用户,所以它拥有执行删除所需的所有细节
然而,更有效的方法是找到一种按ID删除用户的方法,这样就不必查询数据库来获取用户的实例,然后将其删除
希望这有帮助
克里斯
# 3 楼答案
为了删除ID为“1s54f”的用户,您应该创建一个delete HQL,如下所示:
然后您可以使用以下方法:
希望这有帮助