2011-12-21 71 views
19

我使用JPA2与Hibernate并尝试为我的实体引入一个公共基类。到目前为止,它看起来像这样:MappedSuperclass - 在子类中更改SequenceGenerator

@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。

回答

25

是的,这是可能的。您可以使用@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;
  • 派生类

@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合作。
+1

我和的EclipseLink 2.6.1-RC1测试和它的工作了。 – leonardoborges 2015-08-11 14:39:57

+0

这是个好消息。谢谢!我要编辑答案。 – rbento 2015-08-11 14:57:37

+0

此外,所有子类必须具有@SequenceGenerator定义,否则映射将引发错误 – 2015-08-29 12:28:47

11

在JPA中无法使用注释完成。注释本身不能被覆盖。实体继承了MappedSuperClass的所有映射信息。仅存在两个注解可用于重新定义从映射超类继承映射:

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

它们都没有帮助GeneratedValue。

2

使用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 { 
    ... 
}