2011-08-16 31 views
8

Tôi có một đối tượng liên tục (Hành động) và mô hình dữ liệu được tạo tự động (Action_). Bằng cách có một đối tượng của lớp Action và một thể hiện của SingularAttribute, có thể lấy trường tương ứng với SingularAttribute đã cho không?Làm thế nào để có được giá trị được ánh xạ SingularAttribute của một đối tượng liên tục?

Tôi cần một chức năng như thế này:

public S getValue(T object,SingularAttribute<T,S> attribute); 

thực thể của tôi lớp (Action.java):

@Entity 
@Table(name="ACTION") 
public class Action implements Serializable { 
    private long id; 
    private String name; 

    public Action() { 
    } 


    @Id 
    @Column(unique=true, nullable=false, precision=6) 
    public long getId() { 
     return this.id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 


    @Column(length=50) 
    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

mô hình lớp meta của tôi (Action_.java):

@StaticMetamodel(Action.class) 
public class Action_ { 
    public static volatile SingularAttribute<Action, Long> id; 
    public static volatile SingularAttribute<Action, String> name; 
} 
+0

JPA không có ở đó để cung cấp giá trị của lĩnh vực của một đối tượng, đó là để kéo dài/lấy đối tượng. Như trả lời nói, sử dụng Java phản ánh. – DataNucleus

Trả lời

4

Bạn có thể sử dụng phương thức getJavaMember() để nhận thành viên, sau đó kiểm tra xem thành viên này có phải là Field hoặckhôngvà truy cập trường hoặc gọi phương thức trên đối tượng bằng cách sử dụng phản chiếu.

Có thể bạn sẽ phải làm cho trường hoặc phương thức có thể truy cập được trước khi truy cập/gọi nó. Và bạn cũng sẽ phải xử lý chuyển đổi kiểu nguyên thủy cho các đối tượng.

Câu hỏi chính là: tại sao bạn cần điều này?

Nếu bạn cần nó chỉ dành cho lớp thực thể cụ thể này, bạn chỉ có thể sử dụng một công tắc trên tên thuộc tính và trả về giá trị thích hợp:

switch (attribute.getName()) { 

    case "name": 
     return action.getName(); 
    ... 
} 
+0

Cảm ơn bạn đã phản hồi nhanh chóng. Tôi muốn tạo ra một lớp chung mà có thể làm việc với bất kỳ đối tượng liên tục nhất định nào (bằng cách sử dụng mô hình meta). Ví dụ một lớp để biểu diễn bất kỳ bảng cơ sở dữ liệu nào. Sử dụng hàm getJavaMember() có vẻ là cách duy nhất nhưng vì tất cả các đối tượng liên tục nên cung cấp các phương thức getter cho các trường của chúng, tôi mong đợi API cung cấp chức năng để nhận tất cả các trường (Sử dụng phương thức getter nếu cần). –

+0

Nó hoạt động. Như tôi mong đợi SingularAttribute trở lại trường hợp của phương pháp hoặc lĩnh vực dựa trên nơi các @ cột được thiết lập. Cảm ơn một lần nữa! –

8

Như JB Nizet gợi ý, bạn có thể sử dụng getJavaMember. Tôi thấy rằng tôi không cần phải thiết lập các lĩnh vực tư nhân để có thể truy cập, có lẽ Hibernate đã làm điều này.

Trong trường hợp này là hữu ích, đây là một số mã mà làm việc cho tôi:

/** 
* Fetches the value of the given SingularAttribute on the given 
* entity. 
* 
* @see http://stackoverflow.com/questions/7077464/how-to-get-singularattribute-mapped-value-of-a-persistent-object 
*/ 
@SuppressWarnings("unchecked") 
public static <EntityType,FieldType> FieldType getValue(EntityType entity, SingularAttribute<EntityType, FieldType> field) { 
    try { 
     Member member = field.getJavaMember(); 
     if (member instanceof Method) { 
      // this should be a getter method: 
      return (FieldType) ((Method)member).invoke(entity); 
     } else if (member instanceof Field) { 
      return (FieldType) ((Field)member).get(entity); 
     } else { 
      throw new IllegalArgumentException("Unexpected java member type. Expecting method or field, found: " + member); 
     } 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 
+0

Giải pháp tốt. Chúng tôi đã dễ dàng bắt nguồn một EntityAttributeCollection để chúng tôi có thể lặp qua các thuộc tính của các thực thể trong một bộ sưu tập hiện có. – mazatwork

+0

Điều này thật tuyệt vời! Tôi có thể tạo một cột mới dễ dàng trong JSF mà không cần thêm nhiều mã! – alexander

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