2012-05-31 22 views
5

Trong một số chú thích JPA Tôi muốn sử dụng tên trường trực tiếp trong mã ở vị trí của dây dễ bị lỗi:Làm cách nào để tự động tạo tên cột dưới dạng chuỗi cuối cùng tĩnh trong metamodel JPA 2.0?

@javax.persistence.OrderBy(value = User_.registrationDate.getName()) 
public List<PlugConfig> getPlugConfigs() { ... } 

Nhưng trên sẽ không biên dịch vì để có được tên tôi phải sử dụng chức năng đó là không liên tục biểu thức (User_ được tạo ra JPA @StaticMetamodel).

Có thể sử dụng metamodel cho điều này theo bất kỳ cách nào hoặc có gắn bó với các hằng số chuỗi trực tiếp không? Có cách nào để tự động tạo ra hằng số chuỗi như vậy cho metamodel? (Tôi đang sử dụng maven-xử-plugin cho thế hệ)

Trả lời

0

Tôi đã không cố gắng nhưng từ những gì tôi đã đọc trong một bối cảnh hoàn toàn khác (không JPA), bạn có thể thử:

  • Chỉ định tùy chỉnh chú thích (RetentionPolicy.SOURCE) và chú thích các lớp thực thể của bạn trong câu hỏi (hoặc bạn chỉ có thể dựa vào chú thích @Entity)
  • Viết một bộ xử lý chú thích, mà viết một lớp học với các lĩnh vực tĩnh

Ví dụ

public class UserConstants{ 
    public static final String REGISTRATION_DATE = User_.registrationDate.getName(); 
} 

Đó chỉ là suy nghĩ. Tôi không biết nếu nó phù hợp trong trường hợp này.

+0

Tôi nghĩ rằng đây là một giải pháp hiện có sẵn đơn giản nhất. – vinga

5

Bây giờ tôi nhận được hai lĩnh vực cho mọi lĩnh vực trong lớp metamodel của tôi, ví dụ:

public static final String _registrationDate="registrationDate"; 
public static volatile SingularAttribute<User, Date> registrationDate; 

Để làm việc này, tôi sử dụng lại mã từ JPAMetaModelEntityProcessor (unfortunatelly đã có vấn đề với chỉ đơn giản là mở rộng lớp này). Tôi đã thêm phương pháp này:

private void addFieldsNamesAsStrings(MetaEntity entity) { 
    if (entity instanceof AnnotationMetaEntity) { 

     AnnotationMetaEntity aentity = (AnnotationMetaEntity) entity; 
     List<MetaAttribute> newMembers = new ArrayList<MetaAttribute>(); 
     for (final MetaAttribute ma : entity.getMembers()) { 

      MetaAttribute nma = new AnnotationMetaAttribute(aentity, null, 
        null) { 
       public String getDeclarationString() { 
        return new StringBuilder() 
          .append("public static final String ") 
          .append(getPropertyName()).append("=\""+ma.getPropertyName()+"\";") 
          .toString(); 
       } 

       @Override 
       public String getPropertyName() { 
        return "_"+ma.getPropertyName(); 
       } 

       @Override 
       public String getMetaType() { 

        return null; 
       } 

      }; 
      newMembers.add(nma); 

      aentity.mergeInMembers(newMembers); 
     } 
    } 

} 

mà tôi gọi trước mỗi sự xuất hiện của

ClassWriter.writeFile(entity, context); 

Tương ứng với cấu hình maven:

 <plugin> 
      <groupId>org.bsc.maven</groupId> 
      <artifactId>maven-processor-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>process</id> 
        <goals> 
         <goal>process</goal> 
        </goals> 
        <phase>generate-sources</phase> 
        <configuration> 
         <processors> 
          <processor> 
           com.company.MyProcessor 
        </processor> 
         </processors> 
         <outputDirectory>target/modelgen/src/main/java</outputDirectory> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

Cảm ơn bạn đã chia sẻ. – Puce

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