假设:
@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
)。我很好奇这种方法是否有任何副作用或风险。
答案 0 :(得分:1)
虽然这样可行,但是帖子类型已更改,并作为BugReport从db返回。我很好奇这种方法是否有任何副作用或风险。
我可以看到的一个问题是您绕过乐观锁定检查,并且更新相同Post
的并发事务可能会覆盖更改。因此,您应该在更新中包含版本检查,如果executeUpdate
返回的计数不是1
则抛出异常。