JPA:根据自动递增的id生成代码

时间:2011-07-18 14:10:20

标签: java hibernate jpa

我有两个字段的实体和id和代码......

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;

@Basic
@Column(name = "code", nullable = false)
private String code;

我想要做的是,根据自动递增的id(使用Mysql作为DB)生成代码。

有没有办法不使用表来为代码列生成密钥。 即

  • id = 1代码为M-000-1
  • id = 2代码是M-000-2等..

我设法做到这一点的唯一方法是使用下面的脚本。我不太确定这是正确的方法。

getEntityManager().persist(myEntity);
getEntityManager().flush();
myEntity.setCode(myEntity.getCode()+myEntity.getId());
getEntityManager().merge(myEntity);

提前致谢! 迪米特里

3 个答案:

答案 0 :(得分:2)

看起来很好。您也许可以将其移动到@PostPersist处理程序。

答案 1 :(得分:1)

您可以使用@GenericGenerator注释创建自定义序列生成器。这是特定于Hibernate,但已知在JPA中工作。

@Id
@GeneratedValue(generator="custom-code-generator")
@GenericGenerator(name="custom-code-generator", strategy = "classname-of-generator",
parameters={...annotated parameters like the sequence name can be specified here ...})
@Column(name = "id")
private Integer id;

该策略将在实现PersistentIdentifierGenerator接口的类中实现,并且如API文档中所述,自定义生成器还将实现Configurable接口以允许配置生成器。

使用@PostPersist注释也可以,因为在刷新EntityManager或者提交与EntityManager关联的事务之前,Id不会刷新到数据库。

答案 2 :(得分:0)

您可以尝试@PostPersist

class EntityClass {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Basic
    @Column(name = "code")
    private String code;

    @PostPersist
    public void generateCode() {
        code = ("M-000-" + id);
    }
}