首页 > 解决方案 > 自定义序列列创建(非 Id) - Jpa Hibernate

问题描述

我需要在我的 events 表中有一个 event_number 列,它可以唯一标识每一行,但该列不是表的@Id。每个 event_number 必须遵循某种格式,例如EVENT100001,EVENT100002,...

我浏览了@GeneratedValue注释,发现这只能与 @Id 列一起使用。但后来找到了这个答案,但不确定它是否会导致任何竞争条件。

有没有更清洁的方法来做到这一点?这是我的实体

@Entity
@Table(name = "events")
public class Event {

    @Id
    @Access(AccessType.PROPERTY)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "event_number", nullable = false, unique = true)
    private String eventNumber;
}

标签: javasqlhibernatejpaentity

解决方案


您可以使用@GeneratorType注释。

你应该有一个 hibernate 的实现ValueGenerator。您可以在下面看到一个简单的示例。

import org.hibernate.Session;
import org.hibernate.tuple.ValueGenerator;

public class EventGenerator implements ValueGenerator<String> 
{
   public String generateValue(Session session, Object owner)
   {
      return  "EVENT" + session
            .createNativeQuery("select nextval('TST_DATA_SEQ')")
            .getSingleResult();
   }
}

然后你可以像这样使用它:

@GeneratorType(type = EventGenerator.class, when = GenerationTime.INSERT)
@Column(name = "event_number")
private String eventNumber;

推荐阅读