Java JPA/Hibernate ClassCastException仅在某些环境中发生

Java JPA/Hibernate ClassCastException仅在某些环境中发生,java,hibernate,jpa,spring-security,classcastexception,Java,Hibernate,Jpa,Spring Security,Classcastexception,我有一些JPA代码,其中Hibernate是抛出可怕的ClassCastException的提供者。然而,它似乎只发生在某些计算机上,而不是在具有完全相同的代码库、配置、数据库模式和数据的其他计算机上。还有其他人遇到过这种情况吗?有办法解决吗?我相当肯定它不是我代码中的一个bug,因为它在某些环境中工作,这些环境是新的Macbook Pros开发机器上的,而在其他MacMini和AmazonLinuxAMI开发机器上则不是 作为参考,当尝试使用摘要身份验证通过Spring Security对用户

我有一些JPA代码,其中Hibernate是抛出可怕的ClassCastException的提供者。然而,它似乎只发生在某些计算机上,而不是在具有完全相同的代码库、配置、数据库模式和数据的其他计算机上。还有其他人遇到过这种情况吗?有办法解决吗?我相当肯定它不是我代码中的一个bug,因为它在某些环境中工作,这些环境是新的Macbook Pros开发机器上的,而在其他MacMini和AmazonLinuxAMI开发机器上则不是

作为参考,当尝试使用摘要身份验证通过Spring Security对用户进行身份验证时,会出现这种情况。Spring被配置为通过调用实现UserDetailsService接口的bean来检索用户列表:

@Component("httpDigestUserDetailsService")
public class HttpDigestUserDetailsService implements UserDetailsService {

    private static final Logger log = LoggerFactory.getLogger(HttpDigestUserDetailsService.class);

    @Autowired
    UserService userService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    List<User> users = userService.findBy("username", username);
    User user = users.get(0);
    return new HttpDigestUserDetails(user);
}
而真正的findBy方法是在AbstractRestService中实现的:

最后,所有域对象扩展的PO基对象:

@MappedSuperclass
public class PO implements Serializable {
    private Long id;

    @Id
    @GeneratedValue
    @Column(name = "id")
    public Long getId() {
        return id;
    }
}
患者和提供者还扩展了PO,并将反向映射回用户。如果看到它会有帮助的话,我可以添加代码

最后,这里是我收到的异常和堆栈跟踪:

HTTP Status 500 - org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of PO.id; nested exception is javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of PO.id

java.lang.IllegalArgumentException: java.lang.ClassCastException@7e46a468
sun.reflect.GeneratedMethodAccessor57.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:164)
org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:341)
org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4491)
org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4213)
org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:209)
org.hibernate.engine.spi.CascadingAction$8.noCascade(CascadingAction.java:375)
org.hibernate.engine.internal.Cascade.cascade(Cascade.java:176)
org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:160)
org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:151)
org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)
org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402)
org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:394)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
com.luminatehealth.service.UserServiceImpl$$EnhancerByCGLIB$$2a6af235.findBy(<generated>)
com.luminatehealth.rest.security.HttpDigestUserDetailsService.loadUserByUsername(HttpDigestUserDetailsService.java:33)
org.springframework.security.web.authentication.www.DigestAuthenticationFilter.doFilter(DigestAuthenticationFilter.java:144)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
我读过Hibernate在加载从共享超类扩展而来的域对象时如何创建代理对象的相关问题,但我看到的大多数建议都说,您应该确保将注释放在属性上,而不是我们已经在做的字段上,或者使用即时加载来避免创建代理。我们所有的关联都已经使用即时加载了。我还不明白为什么要创建代理,因为我认为只有在需要延迟加载关联时才会发生代理。我假设它与本例中的事务管理有关


这两天来,我一直在努力解决这个问题,但进展甚微,因此,我非常感谢您的指点。

嗨,我也遇到了类似的问题,您解决了吗?如果是,请张贴答案
@Entity
@Table(name = "users")
public class User extends PO {

    private Patient patient;
    private Provider provider;
    private Set<UserRole> userRoles;

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "patient_id", nullable = true)
    public Patient getPatient() {
        return Patient;
    }

    public void setPatient(Patient patient) {
        this.patient = patient;
    }


    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "provider_id", nullable = true)
    public Provider getProvider() {
        return provider;
    }

    public void setProvider() {
        this.provider = provider;
    }

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    public Set<UserRole> getUserRoles() {
        return userRoles;
    }

    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }
}
@MappedSuperclass
public class PO implements Serializable {
    private Long id;

    @Id
    @GeneratedValue
    @Column(name = "id")
    public Long getId() {
        return id;
    }
}
HTTP Status 500 - org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of PO.id; nested exception is javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of PO.id

java.lang.IllegalArgumentException: java.lang.ClassCastException@7e46a468
sun.reflect.GeneratedMethodAccessor57.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:164)
org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:341)
org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4491)
org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4213)
org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:209)
org.hibernate.engine.spi.CascadingAction$8.noCascade(CascadingAction.java:375)
org.hibernate.engine.internal.Cascade.cascade(Cascade.java:176)
org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:160)
org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:151)
org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)
org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402)
org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:394)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
com.luminatehealth.service.UserServiceImpl$$EnhancerByCGLIB$$2a6af235.findBy(<generated>)
com.luminatehealth.rest.security.HttpDigestUserDetailsService.loadUserByUsername(HttpDigestUserDetailsService.java:33)
org.springframework.security.web.authentication.www.DigestAuthenticationFilter.doFilter(DigestAuthenticationFilter.java:144)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)