2011-12-21 82 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 { 
    ... 
}