我有一个带有id和版本的实体。在更新时我正在尝试更新它的版本 说
id version OtherProperty1 .... OtherPropertyN
XXX 0 abc1 abcN //on create
XXX 1 something2 something //on update
在having issues with auto-incerment id之后,如链接SO帖子(案例5因非法参数异常而失败)。我尝试使用uuid2策略,该策略不会因同样的异常而失败。它可以正常工作,但会按照描述插入新行以下
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "id")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Id
@Column(name = "version")
public int getVersion() {
return version;
}
我有更新方法
@Override
public void updateEntity(SomeEntity pEntity) {
int version = pEntity.getVersion();
pEntity.setVersion(version + 1); //causes generation of new ID
entityManager.merge(pEntity);
}
pEntity.setVersion(version + 1);
行导致生成新ID,导致更新的行具有新ID和版本0.评估此结果导致成功更新具有给定ID的同一行
为此编写一个sql insert查询很简单,但是在这种情况下如何让JPA生成相同的查询?
PS:虽然使用hibernate enver是维护版本的实用方法,但我的问题是在这篇文章中使用方法解决问题
答案 0 :(得分:1)
您的问题答案非常简短:在JPA实体中设置ID后,ID无法更新其值(是本机类型,对象或复合键)。
如果您想要这种行为,则需要删除旧实体并使用新版本创建一个新实体。
这可能表明您的数据模型存在缺陷。该版本不应该是@Id的一部分,因为你已经有了UUID列..看起来你不希望2行具有相同的“UUID”和不同的版本。