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.
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. –
hoặc đơn giản là Hibernate.getClass() –
Câu trả lời tuyệt vời. Nó đã giúp tôi rất nhiều. – Mythul