mysql - hibernate JPA : Can not set field x to x

标签 mysql spring hibernate spring-mvc jpa

我有这个项目类(class):

@Entity
public class Project implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", unique=true )
private Long id;

@Column(name="name", nullable=false, unique = true)
private String name;

@OneToMany(mappedBy="projectid", fetch = FetchType.EAGER)
private Set<Collaborator> collaborators = new HashSet<>();

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}
}

然后协作者:

@Entity
public class Collaborator implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, nullable = false)
private Long id;

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(nullable = true)
private Project projectid;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}
}


public Project getProjectid() {
    return projectid;
}

public void setProjectid(Project projectid) {
    this.projectid = projectid;
}

在我的 DAO 中我想执行这个查询:

@Query("select c from Collaborator as c where c.projectid = ?1 and  c.showable = true")
List<Collaborator> findAllShowableCollaboratorsByProjectidAndShowableTrue(Long projectId);

但我收到此错误:

Caused by: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.Long gestionprojet.java.entities.beans.Project.id] by reflection for persistent property [gestionprojet.java.entities.beans.Project#id] : 1 at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:71) at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:224) at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4647) at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4358) at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:226) at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:276) at org.hibernate.type.EntityType.getIdentifier(EntityType.java:462) at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:161) at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:53) at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:628) at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1956) at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1909) at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1887) at org.hibernate.loader.Loader.doQuery(Loader.java:932) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349) at org.hibernate.loader.Loader.doList(Loader.java:2615) at org.hibernate.loader.Loader.doList(Loader.java:2598) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430) at org.hibernate.loader.Loader.list(Loader.java:2425) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371) at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1460) at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1426) at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1398) at org.hibernate.Query.getResultList(Query.java:417) at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:114) at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:78) at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:102) at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:92) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:482) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:280) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ... 59 common frames omitted Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field gestionprojet.java.entities.beans.Project.id to java.lang.Long at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source) at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source) at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source) at java.lang.reflect.Field.get(Unknown Source) at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:67) ... 98 common frames omitted

我的环境:

  1. Hibernate 核心 5.2.3
  2. mysql-connector-java 5.1.37
  3. spring-jdbc4.3.2.RELEASE
  4. spring-orm 4.3.2.RELEASE

我已尝试回滚 hibernate t 版本 4,但仍然存在同样的问题。

如有任何帮助,我们将不胜感激。谢谢

最佳答案

Collaborator 中的 projectid 是一个 Project 对象,而不是 Long 对象。因此,将您的存储库方法更改为:

@Query("select c from Collaborator as c where c.projectid.id = ?1 and  c.showable = true")
List<Collaborator> findAllShowableCollaboratorsByProjectidAndShowableTrue(Long projectId);  

建议:

  • 请注意,不建议使用位置参数绑定(bind),因为参数的顺序无法更改(在您的情况下,这似乎很好,因为只有一个参数)。我建议你改变这一点:

    @Query("select c from Collaborator as c where c.projectid.id = :pid and  c.showable = true")
    List<Collaborator> findAllShowableCollaboratorsByProjectidAndShowableTrue(@Param("pid") Long pid);  
    
  • 使用 projectid 作为类型为 Project 的字段名称有点令人困惑。将名称更改为 project 之类的名称看起来更好。

关于mysql - hibernate JPA : Can not set field x to x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39946821/

相关文章:

java - 如何处理 Spring/EJB/Mockito... 代理上的内部调用?

java - Spring JPA Repository n+1 问题,EBEAN 替代方案

java - 使用 Oracle 表分区的 JPA 或 Hibernates?

php - 为什么 sqlsrv_connect 不像以前那样工作?

MySQL - 使用聚合函数加速查询的索引

java - 在 Hibernate 一对一关系中保存外键的问题

java - Spring Data JPA - RepositoryConfigurationExtension 中的错误

mysql - 使用合并在数据库中查找重复项

php - 我怎样才能输出一行 id 让我们说 31

java - 如何在运行时从数据库动态加载身份提供者 (IdP) Sprint Security SAML