|
The problem If you add an @Proxy(proxyClass = ?) to any entity, this entity cannot be used as a parameter in a EntityManager query.
This interface Person and class PersonEntity reproduces the problem.
Person.java
public interface Person {
Integer getId(); void setId(Integer id);
String getName(); void setName(String name);
Person getFriend(); void setFriend(Person person);
}
PersonEntity.java
import javax.persistence.*;
import org.hibernate.annotations.Proxy;
@Entity
@Proxy(proxyClass = Person.class)
public class PersonEntity implements Person {
public static void main(String[] args) {
final EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistence");
final EntityManager entityManager = factory.createEntityManager();
System.out.println(entityManager.createQuery("from PersonEntity where friend = :friend", PersonEntity.class)
.setParameter("friend", entityManager.getReference(PersonEntity.class, 1)).getResultList());
}
private Integer id; private String name; private Person friend;
@Override @Id
@GeneratedValue
public Integer getId() { return id; }
@Override public void setId(Integer id) { this.id = id; }
@Override @Basic
public String getName() { return name; }
@Override public void setName(String name) { this.name = name; }
@Override @OneToOne(targetEntity = PersonEntity.class) public Person getFriend() { return this.friend; }
@Override public void setFriend(Person friend) { this.friend = friend; }
}
Possible solution Apply this change
private static boolean isValidBindValue(Class expectedType, Object value, TemporalType temporalType) {
-if ( expectedType.isInstance( value ) ) {
+if ( expectedType.isAssignableFrom( HibernateProxyHelper.getClassWithoutInitializingProxy(value) ) ) {
return true;
}
4.3: hibernate-entitymanager/src/main/java/org/hibernate/jpa/spi/BaseQueryImpl.java 4.2: hibernate-entitymanager/src/main/java/org/hibernate/ejb/AbstractQueryImpl.java
|