2011-12-21 28 views
19

Tôi đang sử dụng JPA2 với Hibernate và cố gắng giới thiệu một lớp cơ sở chung cho các thực thể của tôi. Cho đến thời điểm này, có vẻ như:MappedSuperclass - Thay đổi SequenceGenerator trong phân lớp

@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; 
    } 
} 

Tuy nhiên, đối với mỗi bảng có trình tự là trình tạo chuỗi của tôi. Làm thế nào tôi có thể thiết lập nó từ lớp con của tôi? Tôi nghĩ rằng tôi cần phải ghi đè lên @GeneratedValue và tạo một SequenceGenerator mới với @SequenceGenerator.

Trả lời

25

Có, điều đó là có thể. Bạn có thể ghi đè tên máy phát mặc định bằng chú thích @SequenceGenerator.

  • class Base
@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; 
     } 
    }
  • Sequence (SQL)

    create sequence role_seq;
  • nguồn gốc lớp

@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; 
     } 
    }
  • Cách tiếp cận này hoạt động tốt trong Hibernate 4.1.x, nhưng không có trong EclipseLink 2.x.

chỉnh sửa

  • Theo nhận xét, có vẻ như được làm việc với EclipseLink 2.6.1-RC1.
+1

Tôi đã thử nghiệm với EclipseLink 2.6.1-RC1 và nó làm việc quá. – leonardoborges

+0

Đó là tin tuyệt vời. Cảm ơn bạn! Tôi sẽ chỉnh sửa câu trả lời. – rbento

+0

Ngoài ra, tất cả các lớp con phải có @SequenceGenerator được xác định nếu không thì lỗi sẽ được ném cho ánh xạ –

11

Trong JPA không thể thực hiện được bằng chú thích. Bản thân chú thích không thể bị ghi đè. Pháp nhân kế thừa tất cả thông tin ánh xạ từ MappedSuperClass. Chỉ có hai chú thích có thể được sử dụng để xác định lại ánh xạ kế thừa từ lớp cha ánh xạ:

  1. AttributeOverride để ghi đè lên các ánh xạ cột và
  2. AssociationOverride để ghi đè lên tham gia các cột/bảng.

Cả hai đều không hỗ trợ GeneratedValue.

2

Với EclipseLink, bạn có thể sử dụng Customizer. Giao diện DescriptorCustomizer xác định cách tùy chỉnh tất cả thông tin về trình mô tả jpa (còn gọi là thực thể liên tục).

public class SequenceCustomizer implements DescriptorCustomizer { 

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

và trong lớp cha ánh xạ của bạn:

@MappedSuperclass 
@Customizer(SequenceCustomizer.class) 
public abstract class AbstractEntity implements Serializable { 
    ... 
} 
Các vấn đề liên quan