2013-05-29 35 views
6

Tôi có lớp ngủ đông này với chú thích:Cách tạo chú thích meta ở cấp trường?

@Entity 
public class SimponsFamily{ 

    @Id 
    @TableGenerator(name = ENTITY_ID_GENERATOR, 
       table = ENTITY_ID_GENERATOR_TABLE, 
       pkColumnName = ENTITY_ID_GENERATOR_TABLE_PK_COLUMN_NAME, 
       valueColumnName = ENTITY_ID_GENERATOR_TABLE_VALUE_COLUMN_NAME) 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = ENTITY_ID_GENERATOR) 
    private long id; 

    ... 
} 

Kể từ khi tôi không won't chú thích mỗi id lĩnh vực lớp học của tôi theo cách đó, tôi đã cố gắng để tạo ra một anotation tùy chỉnh:

@TableGenerator(name = ENTITY_ID_GENERATOR, 
      table = ENTITY_ID_GENERATOR_TABLE, 
      pkColumnName = ENTITY_ID_GENERATOR_TABLE_PK_COLUMN_NAME, 
      valueColumnName = ENTITY_ID_GENERATOR_TABLE_VALUE_COLUMN_NAME) 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface EntityId { 

    @GeneratedValue(strategy = GenerationType.TABLE, generator = ENTITY_ID_GENERATOR) 
    public int generator() default 0; 

    @Id 
    public long id() default 0; 
} 

vì vậy mà tôi có thể sử dụng chú thích này trong lớp học của tôi:

@Entity 
public class SimponsFamily{ 


@EntityId 
private long id; 

    ... 
} 

tôi phải viết @Id và các chú thích @GeneratedValue ở cấp trường vì chúng không hỗ trợ TYPE RetentionPolicy. Giải pháp này dường như hoạt động.

Câu hỏi của tôi:

  • như thế nào các chú thích cấp cơ sở trong các chú thích của tôi tùy chỉnh (và giá trị) chuyển đến việc sử dụng của tôi ENTITYID chú thích?

  • Điều gì về các giá trị mặc định mà tôi đã đặt trong chú thích tùy chỉnh của mình, chúng có được sử dụng vì tôi không chỉ định thuộc tính khi sử dụng không?

  • Đó là cách ưa thích để sử dụng chú thích ở cấp trường trong chú thích?

Trả lời

4

Tôi nghĩ rằng tôi có thể giải quyết câu hỏi thứ ba của bạn.

Một cách phổ biến để làm những gì bạn muốn (tránh trùng lặp ánh xạ ID) là tạo một lớp cha thường giữ các trường được chú thích idversion (để khóa lạc quan) và sau đó có tất cả các đối tượng liên tục mở rộng siêu lớp này. Để đảm bảo siêu lớp không được coi là một Thực thể, nó phải được chú thích bằng @MappedSuperclass.

Đây là một mẫu (xin lỗi vì lỗi chính tả, tôi không có một IDE trong tầm tay ngay bây giờ):

@MappedSuperclass 
public class PersistentObject { 

    @Id // Put all your ID mapping here 
    private Long id; 

    @Version 
    private Long version; 

} 

@Entity 
public class SimpsonsFamily extends PersistentObject {   
    // Other SimpsonFamily-specific fields here, with their mappings  
} 
+0

Hy vọng của tôi là tôi có thể tránh được một lớp cha, nhưng có lẽ đây là con đường để đi ... có lẽ câu hỏi của tôi là một vấn đề chú thích chung hơn là một vấn đề hibernate. Dù sao cũng cảm ơn! – thilko

Các vấn đề liên quan