【问题标题】:Hibernate JPA : Can not set field x to xHibernate JPA:无法将字段 x 设置为 x
【发布时间】:2017-02-18 04:46:35
【问题描述】:

我有这个项目类:

@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);

但是我收到了这个错误:

原因:org.hibernate.property.access.spi.PropertyAccessException:通过反射持久属性 [gestionprojet.java.实体.beans.Project#id]:1 在 org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:71) 在 org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:224) 在 org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4647) 在 org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4358) 在 org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:226) 在 org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:276) 在 org.hibernate.type.EntityType.getIdentifier(EntityType.java:462) 在 org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:161) 在 org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:53) 在 org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:628) 在 org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1956) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1909) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1887) 在 org.hibernate.loader.Loader.doQuery(Loader.java:932) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349) 在 org.hibernate.loader.Loader.doList(Loader.java:2615) 在 org.hibernate.loader.Loader.doList(Loader.java:2598) 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430) 在 org.hibernate.loader.Loader.list(Loader.java:2425) 在 org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371) 在 org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) 在 org.hibernate.internal.SessionImpl.list(SessionImpl.java:1460) 在 org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1426) 在 org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1398) 在 org.hibernate.Query.getResultList(Query.java:417) 在 org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:114) 在 org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:78) 在 org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:102) 在 org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:92) 在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:482) 在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 在 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:280) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ...省略了59个常用框架 原因:java.lang.IllegalArgumentException:无法将 java.lang.Long 字段 gestionprojet.java.entities.beans.Project.id 设置为 java.lang.Long 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(未知来源) 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(未知来源) 在 sun.reflect.UnsafeFieldAccessorImpl.ensureObj(未知来源) 在 sun.reflect.UnsafeObjectFieldAccessorImpl.get(未知来源) 在 java.lang.reflect.Field.get(未知来源) 在 org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:67) ...省略了98个常用框架

我的环境:

  1. 休眠核心 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 但仍然是同样的问题。

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: mysql spring hibernate spring-mvc jpa


    【解决方案1】:

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

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

    建议:

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

      @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 之类的名称看起来更好。

    【讨论】:

    • 感谢您的回复和建议。我还有一个现象:当我将数据添加到单独的 3 个表时,行的 id 会相应增加,例如:如果我将数据添加到项目 id = 1 并且合作者 id 将等于 @ 987654333@。有什么想法吗?
    • 对不起,我不太明白你的问题。它应该像这样工作,因为如果您在谈论为什么在插入时增加 id ,您在实体的 id 字段上指定了自动增量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2017-10-08
    • 2018-11-11
    • 2019-11-08
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多