2011-07-18 64 views
1

我已经和实体两个字段的ID和因此代码的代码......JPA:基于自动递增的ID

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

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

我想什么做的是,产生该代码基于自动递增的ID(使用Mysql作为数据库)。

有没有一种方法不使用表来生成代码列的键。 即

  • ID = 1级的代码是M-000-1
  • ID = 2码是M-000-2等。

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

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

在此先感谢! Dimitri

回答

1

看起来不错。您可以将其移至@PostPersist处理程序。

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); 
    } 
} 
+0

这种感觉不是一种很好的方法。当你进行合并时会发生什么?然后你将在DB和持久层中有不同的ID .. – Marthin

+0

由于ID是主键,它会在持续时间内生成一次;之后,它不会改变。你能否提供关于你的合并案例的更多细节? –

+0

我的歉意,我误解了原来的问题(我认为DB中的id是代码)。我现在同意你的解决方案。抱歉占用你的时间。 – Marthin

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不会刷新到数据库。