休眠:与更改DiscriminatorValue相关的风险

时间:2010-09-16 05:08:55

标签: java hibernate orm jpa

假设:

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="postType", discriminatorType=DiscriminatorType.STRING)
public class Post {}

@DiscriminatorValue(value = PostType.BUG)
public class BugReport extends Post {}

那就是......臭虫在这个系统中作为帖子开始生活。之后,他们可以升级(?)成为BugReport。

我正在使用以下方法更新此内容:

@Transactional
public Post setPostType(Post post, String postType)
{
    SQLQuery sql = getSession().createSQLQuery("UPDATE post SET postType = :postType where id = :id");
    sql.setString("postType", postType);
    sql.setInteger("id", post.getId());
    sql.executeUpdate();

    getSession().evict(post);
    getSession().flush();

    Post newPost = get(post.getId());
    return newPost;
}

虽然这有效,但(帖子类型已更改,并从数据库返回为BugReport)。我很好奇这种方法是否有任何副作用或风险。

1 个答案:

答案 0 :(得分:1)

  

虽然这样可行,但是帖子类型已更改,并作为BugReport从db返回。我很好奇这种方法是否有任何副作用或风险。

我可以看到的一个问题是您绕过乐观锁定检查,并且更新相同Post的并发事务可能会覆盖更改。因此,您应该在更新中包含版本检查,如果executeUpdate返回的计数不是1则抛出异常。