java - 自定义序列列创建(非 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;
}
解决方案
您可以使用@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;