2010-11-02 27 views
5

Tôi không thể chạy thử nghiệm sau đây: -Thuộc tính metamodel đã khai báo hoạt động tốt NHƯNG Thuộc tính Metamodel thừa kế là NULL. Tại sao?

@Test 
public void test() { 
    EntityManager em = entityManagerFactory.createEntityManager(); 
    em.getTransaction().begin(); 

    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<Project> query = builder.createQuery(Project.class); 

    Root<Project> project = query.from(Project.class); 

    Path<String> name = project.get(Project_.name); 
    Assert.assertNotNull(name); 

    Path<EntityLifeCycleImpl> lifeCycle = project.get(Project_.lifeCycle); // problem is here, throws NullPointer 
    Assert.assertNotNull(lifeCycle); 
} 

nó ném NullPointerException tại project.get(Project_.lifeCycle) dòng. Tại sao?

java.lang.NullPointerException 
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138) 

PersistenceEntityBase.java

import org.hibernate.annotations.GenericGenerator; 
     @MappedSuperclass 
@Access(AccessType.PROPERTY) 
public abstract class PersistentEntityBase { 

protected String identifier; 

protected EntityLifeCycleImpl lifeCycle = new EntityLifeCycleImpl(); 

protected PersistentEntityBase() { 
} 

@Id 
@GeneratedValue(generator="generator") 
@GenericGenerator(name="generator", strategy="guid", parameters = {}) 
@Column(name="identifier") 
public String getIdentifier() { 
    return identifier; 
} 

public void setIdentifier(String identifier) { 
    this.identifier = identifier; 
} 

@Embedded 
public EntityLifeCycleImpl getLifeCycle() { 
    return lifeCycle; 
} 
public void setLifeCycle(EntityLifeCycleImpl lifeCycle) { 
    this.lifeCycle = lifeCycle; 
} 

}

Project.java

@Entity 
@Table(name="project") 
@Access(AccessType.PROPERTY) 
public class Project extends PersistentEntityBase { 

    private String name; 

    protected Project() { 
    } 

    public Project(String name) { 
     this(); 
     this.name = name; 
    } 

    @Column(name="name", nullable=false, unique=true) 
    public String getName() { 
     return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 

}

EntityLifeCycleImpl.java

@Embeddable 
public class EntityLifeCycleImpl implements EntityLifeCycle { 
    private String createdBy; 
    private Date createdDate; 
     @Column(name="created_by") 
public String getCreatedBy() { 
    return createdBy; 
} 
public void setCreatedBy(String createdBy) { 

    this.createdBy = createdBy; 
} 

@Column(name="created_date") 
public Date getCreatedDate() { 
    return createdDate; 
} 
public void setCreatedDate(Date createdDate) { 
    this.createdDate = createdDate; 
} 

}

PersistentEntityBase_.java (tạo sử dụng Hibernate metamodel Generator)

@StaticMetamodel(PersistentEntityBase.class) 
public abstract class PersistentEntityBase_ { 
    public static volatile SingularAttribute<PersistentEntityBase, EntityLifeCycleImpl> lifeCycle; 
     public static volatile SingularAttribute<PersistentEntityBase, String> identifier; 
    } 

Project_.java

@StaticMetamodel(Project.class) 
public abstract class Project_ extends PersistentEntityBase_ { 
    public static volatile SingularAttribute<Project, String> name; 
    } 

EntityLifeCycleImpl_.java

@StaticMetamodel(EntityLifeCycleImpl.class) 
public abstract class EntityLifeCycleImpl_ { 
    public static volatile SingularAttribute<EntityLifeCycleImpl, String> createdBy; 
    public static volatile SingularAttribute<EntityLifeCycleImpl, Date> createdDate; 
} 

persistence.xml (chỉ là một phần relavent)

<class>com.comp.timetracking.entity.PersistentEntityBase</class> 
<class>com.comp.timetracking.entity.Project</class> 

EDIT: tôi sử dụng hibernate-entitymanager.3.6.0.Final và hibernate-jpamodelgen.1.0.0.Final.

EDIT 2 @Pascal
Tôi nghĩ rằng Hibernate EM 3.6.0.Final cho phép chúng ta xác định @Embedded lĩnh vực chú thích ở @Entity mức nhưng nó phủ nhận lĩnh vực này tại @MappedSuperclass cấp. bạn nói gì?

Vì tôi không thể thấy "tùy chọn tải lên tệp" ở đây, tôi đã tải lên TestCase trong tài khoản esnips của mình. Download dự án dựa trên maven và chạy SingularAttributeTest.java. Và kiểm tra các giao diện điều khiển đầu ra

ERROR main metamodel.MetadataContext:413 - Unable to locate static metamodel field : timetracking.entity.Employee_#lifeCycle 

Bấm vào "Tải embedded-singular-attribute.zip" liên kết để tải file mà không cần cài đặt trình quản lý download. (Nếu bạn nhấp vào Download link with Green arrow, bạn sẽ phải cài đặt trình quản lý tải xuống !!)

+0

Replica của câu hỏi này: - https://forum.hibernate.org/viewtopic.php?f=1&t=1008173 – dira

Trả lời

6

Tôi đã kiểm tra các lớp và trường hợp thử nghiệm với EclipseLink (Tôi đã xóa các phần cụ thể của Hibernate) và kiểm tra.Nhưng nó thực sự thất bại với Hibernate 3.5.6. Trông giống như một lỗi trong Hibernate.

Bằng cách này, bạn đang thiếu một chú thích Temporal trong bạn Embeddable

@Column(name = "created_date") 
@Temporal(TemporalType.DATE) 
public Date getCreatedDate() { 
    return createdDate; 
} 

Và bạn đang không được phép tuyên bố PersistentEntityBase trong persistence.xml (một siêu lớp ánh xạ không phải là một thực thể).

+0

1 Ý của bạn là Tôi nên sử dụng EclipseLink thay vì Hibernate EM? Và cảm ơn thông tin về chú thích @Temporal. – dira

+0

@ becomputer06: Tôi về cơ bản chỉ ra rằng trường hợp của bạn làm việc với RI và rằng vấn đề âm thanh như một lỗi trong Hibernate và bạn nên báo cáo nó (với một trường hợp thử nghiệm). Một lỗi sẽ không được sửa nếu không có ai báo cáo. Nhưng tôi không thể nói nếu vấn đề này là đủ quan trọng để bạn có thể biện minh cho việc chuyển sang một nhà cung cấp khác (không có gì chặn IMO, gây phiền nhiễu có, ngăn chặn không). Và các nhà cung cấp khác cũng không có lỗi. Cuộc gọi của bạn :) –

+0

kiểm tra câu hỏi được cập nhật. (EDIT 2 phần) – dira

1

tôi đã cùng một vấn đề: Trong triển khai các JBoss 7.0.2 thông báo lỗi sau: "Không thể xác định vị trí metamodel tĩnh lĩnh vực X" trong đó X là một lĩnh vực kế thừa từ một @MappedSuperclass và chú thích với @Embedded (các loại X là một lớp được chú thích bằng @Embeddable).

Tôi đã giải quyết nó thêm các lớp được chú thích bằng @Embeddable và @MappedSuperclass, cùng với các lớp được chú thích bằng @Entity, trong danh sách các lớp được quản lý bởi đơn vị kiên trì. Điều này được định cấu hình trong tệp "persistence.xml".

+1

@Andro Selva Tôi cũng phải đối mặt với cùng một vấn đề ở đây. Sau khi các lớp '@ Embeddable' được đăng ký trong tệp' persistence.xml'. – Arunprasad

1

đây không phải là vấn đề.

Từ Hibernate tài liệu:

If class X extends another class S, where S is the most derived managed class (i.e., entity or mapped superclass) extended by X, then class X_ must extend class S_, where S_ is the metamodel class created for S.

https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/metamodel.html

+0

Tôi nên tự nghĩ về điều đó, làm việc như một sự quyến rũ – hecko84

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