Hibernate UPDATE Query将其他值设置为NULL

时间:2015-09-21 10:42:33

标签: java mysql hibernate rest

我有以下表格用于在MySQL中存储我的博文:

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| PostID    | int(11)      | NO   | PRI | NULL    | auto_increment |
| PostTitle | varchar(250) | YES  |     | NULL    |                |
| PostDate  | datetime     | YES  |     | NULL    |                |
| OwnerID   | int(11)      | YES  | MUL | NULL    |                |
| PostVote  | int(11)      | YES  |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

我想使用hibernate UPDATE查询仅更新PostVote

这是我的JAVA方法:

@PUT
@Consumes({ MediaType.APPLICATION_JSON })
public void updateVotes (Posts p) {
Session ses = HibernateUtil.currentSession();
Transaction tx = null;
try{
    tx =ses.beginTransaction();
    ses.createQuery("UPDATE Posts SET PostVote="+p.getPostVote() +" WHERE PostID="+p.getPostID()+" AND OwnerID="+p.getOwnerID());
    ses.update(p);
    tx.commit();    
}catch (HibernateException e) {
    if (tx!=null) tx.rollback();
    e.printStackTrace();
 }finally {
     HibernateUtil.closeSession(); 
 }
}

我在帖子P (Post ID,PostVote,OwnerID)中只使用3个参数调用此方法,因为这些是我查询所需的唯一参数。 但是,一旦执行了查询,除了这3个值之外,所有其他值都将设置为NULL。 这是hibernate查询输出:

Hibernate: update posts set PostTitle=?, PostDate=?, OwnerID=?, PostVote=? where PostID=?

这显然不会很好,因为它似乎更新了不需要的元素。有什么建议在我的实际查询中可能出错吗?

2 个答案:

答案 0 :(得分:0)

使用dynamic-update=true

点击此链接可能对您有所帮助

http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/

答案 1 :(得分:0)

我通过修改我的代码解决了这个问题,如下所示:

try{
    tx =ses.beginTransaction();
    Posts p2 = new Posts();
    **p2 = (Posts)ses.get(Posts.class, p.getPostID());**
    p2.setPostID(p.getPostID());
    p2.setPostVote(p.getPostVote());
    p2.setOwnerID(p.getOwnerID());
//  ses.createQuery("UPDATE Posts SET PostVote="+p.getPostVote() +" WHERE PostID="+p.getPostID()+" AND OwnerID="+p.getOwnerID());
    ses.update(p2);
    tx.commit();    
}

以上代码的重要变化如下:

p2 = (Posts)ses.get(Posts.class, p.getPostID());
在这种情况下,

Hibernate查询仍然相同,即:

Hibernate: update posts set PostTitle=?, PostDate=?, OwnerID=?, PostVote=? where PostID=?

然而,由于我已根据PostID获取帖子,因此Post P的所有元素现在都具有有效值。我现在可以修改所需的并在数据库中更新整个Post。

我还试过在我的XML映射文件中添加dynamic-update="true"。但请注意,如果我们首先使用only获取帖子,即使它会有效session.get(Classname.class, id)。它只是对hibernate查询产生了以下不同:

Hibernate: update posts set PostVote=? where PostID=?

结论:

  1. 如果您想进行选择性更新,必须先使用主键获取数据,而不要影响同一行中的其他元素。
  2. 最终结果是相同的,有或没有dynamic-update="true"。但是,Hibernate对数据库的查询会有所不同。