MappedSuperclass – 在子类中更改SequenceGenerator

我正在使用JPA2和Hibernate,并尝试为我的实体引入一个公共基类。 到目前为止看起来像这样:

@MappedSuperclass public abstract class BaseEntity { @Id private Long id; @Override public int hashCode() { // ... } @Override public boolean equals(Object obj) { // ... } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } } 

但是,对于每个表都有一个序列$entityname_seq ,我想用它作为我的序列生成器。 如何从我的子类中设置它? 我想我需要覆盖@GeneratedValue并使用@SequenceGenerator创建一个新的SequenceGenerator。

对的,这是可能的。 您可以使用@SequenceGenerator注释覆盖默认生成器名称。

  • 基类
  @MappedSuperclass public abstract class PersistentEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "default_gen") protected Long id = 0L; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } 
  • 序列(SQL)

     create sequence role_seq; 
  • 派生class

  @Entity @Table(name = "role") @SequenceGenerator(name = "default_gen", sequenceName = "role_seq", allocationSize = 1) public class Role extends PersistentEntity implements Serializable { private static final long serialVersionUID = 1L; @NotNull @Size(max = 32) private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 
  • 这种方法在Hibernate 4.1.x中运行良好,但它在EclipseLink 2.x中没有。

编辑

  • 根据评论,它似乎与EclipseLink 2.6.1-RC1一起使用。

在JPA中,无法使用注释完成。 注释本身不能被覆盖。 实体从MappedSuperClassinheritance所有映射信息。 只有两个注释可用于重新定义从映射的superClassinheritance的映射:

  1. AttributeOverride用于覆盖列映射和
  2. AssociationOverride覆盖连接列/表。

他们都没有帮助GeneratedValue。

使用EclipseLink,您可以使用CustomizerDescriptorCustomizer接口定义了一种自定义jpa描述符(也称为持久实体)的所有信息的方法。

 public class SequenceCustomizer implements DescriptorCustomizer { @Override public void customize(ClassDescriptor descriptor) throws Exception { descriptor.setSequenceNumberName(descriptor.getTableName()); } } 

并在您映射的超类中:

 @MappedSuperclass @Customizer(SequenceCustomizer.class) public abstract class AbstractEntity implements Serializable { ... }