JPA使用复合键

时间:2015-08-01 10:54:11

标签: java mysql hibernate jpa

我有一个带有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是维护版本的实用方法,但我的问题是在这篇文章中使用方法解决问题

1 个答案:

答案 0 :(得分:1)

您的问题答案非常简短:在JPA实体中设置ID后,ID无法更新其值(是本机类型,对象或复合键)。

如果您想要这种行为,则需要删除旧实体并使用新版本创建一个新实体。

这可能表明您的数据模型存在缺陷。该版本不应该是@Id的一部分,因为你已经有了UUID列..看起来你不希望2行具有相同的“UUID”和不同的版本。