2009-07-16 29 views
5

Tôi có bộ chuyển đổi JSF mà tôi sử dụng cho danh sách SelectItem có chứa một số loại thực thể khác nhau. Trong phương thức getAsString(), tôi tạo chuỗi như tên lớp được gắn với ":" và ID.Đang tải đối tượng Hibernate javassist-ed Hibernate

MySuperClass superClass = (MySuperClass)value; 
if(superClass != null) { 
    return String.valueOf(superClass.getClass().getName()+":"+superClass.getId()); 
} 

này cho phép tôi để nạp các thực thể chính xác trong getAsObject() trên đường trở về từ UI bằng cách làm này:

String className = value.substring(0, value.indexOf(":")); 
long id = Long.parseLong(value.substring(value.indexOf(":")+1)); 
Class<T> entitySuperClass = (Class<T>) Class.forName(className); 
MySuperClass superClass = (MySuperClass)getEntityManager().find(entitySuperClass, id); 

Vấn đề của tôi là thực thể của tôi trong getAsString() là một proxy. Vì vậy, thay vì nhận được com.company.MyEntity khi tôi thực hiện getClass(). GetName() Tôi nhận được com.company.MyEntity_$$_javassist_48 để sau đó nó không thành công trên find().

Có cách nào (ngoài thao tác chuỗi) để lấy tên lớp cụ thể (ví dụ: com.company.MyEntity) không?

Cảm ơn.

Trả lời

9

Thay vì superClass.getClass() hãy thử org.hibernate.proxy.HibernateProxyHelper.getClassWithoutInitializingProxy(superClass).

+0

tôi đã sử dụng ((HibernateProxy) thực thể) .getHibernateLazyInitializer(). getEntityName() hoặc getPersistentClass() nhưng HibernateProxy kết thúc tốt đẹp vì vậy nó có lẽ là con đường để đi. –

+11

hoặc đơn giản là Hibernate.getClass() –

+0

Câu trả lời tuyệt vời. Nó đã giúp tôi rất nhiều. – Mythul

6

Có một sự khác biệt quan trọng giữa Hibernate.getClass()HibernateProxyHelper! Các HibernateProxyHelper luôn trả về lớp cha đại diện cho bảng trong cơ sở dữ liệu nếu bạn có và thực thể được ánh xạ sử dụng

@Table(name = SuperClass.TABLE_NAME) 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = SuperClass.TABLE_DISCRIMINATOR, discriminatorType = DiscriminatorType.STRING) 

@DiscriminatorValue(value = EntityClass.TABLE_DISCRIMINATOR) 

trong lớp con.

Hibernate.getClass (...) trả về lớp con thực sự cho những thứ đó.

3

Khi kết hợp với thừa kế thực thể trừu tượng của (AbstractEntity <-ConcreteEntity < - ConcreteEntityProxy), nhận lớp kiên trì chỉ là không đủ:

// This should fail - trying to create an abstract class 
HibernateProxyHelper.getClassWithoutInitializingProxy(superClass).newInstance() 

thay vì có được lớp thực hiện:

protected <T> T deproxy(T maybeProxy) { 
    if (maybeProxy instanceof HibernateProxy) { 
     return (T) ((HibernateProxy) maybeProxy).getHibernateLazyInitializer().getImplementation(); 
    } 
    return maybeProxy; 
} 
Các vấn đề liên quan