当前位置: 首页 > 知识库问答 >
问题:

对eToOne的热切共享关系执行联接获取时出现JPA ArgumentException错误

宫俊才
2023-03-14

我正面临着一个连接获取和渴望关系的问题。

实体C与抽象实体E具有反向关系

在执行简单的namedQuery时,如

SELECT a FROM A a WHERE a.key = :key

其中参数'key'是字符串类型,那么我没有问题。从检索到的实体A访问子实体B,按照其假定执行子请求。

SELECT a FROM A a JOIN FETCH a.entitiesB WHERE a.key = :key
javax.ejb.EJBTransactionRolledbackException: The transaction has been marked rollback only because the bean encountered a non-application exception :javax.ejb.EJBTransactionRolledbackException : The transaction has been marked rollback only because the bean encountered a non-application exception :org.apache.openjpa.persistence.ArgumentException : The specified parameter of type "class org.apache.openjpa.util.LongId" is not a valid query parameter.
at org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:345)
at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:283)
... 
Caused by: <openjpa-2.2.0-r422266:1244990 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: The specified parameter of type "class org.apache.openjpa.util.LongId" is not a valid query parameter.
FailedObject: SELECT relation FROM Relation relation JOIN FETCH relation.accounts WHERE relation.key = :key [java.lang.String]
at org.apache.openjpa.jdbc.sql.DBDictionary.setUnknown(DBDictionary.java:1458)
at org.apache.openjpa.jdbc.sql.SQLBuffer.setParameters(SQLBuffer.java:544)
at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:453)
at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:429)
at org.apache.openjpa.jdbc.sql.SelectImpl.prepareStatement(SelectImpl.java:479)
... 

这是说明问题的代码示例。

实体A

@Entity
@Table(name = "TABLE_A")
@Access(AccessType.FIELD)
@NamedQueries({
   @NamedQuery(name = "findADetails", query = "SELECT a FROM A a WHERE a.customKey.key     = :customKey")})
public class A extends abstractEntity {

   @Embedded
   private CustomEmbeddedKey customKey;

   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "entityA")
   private List<B> bEntities;

   ...
}

实体B

@Entity
@Table(name = "TABLE_B")
@Access(AccessType.FIELD)
public class B extends abstractEntity {

   @ManyToOne(fetch = FetchType.LAZY, targetEntity = A.class)
   @JoinColumn(name = "FK_A_ID")
   private A entityA;

   ...
}
@Entity
@Access(AccessType.FIELD)
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@SequenceGenerator(name = "TOTO_ID_SEQ", sequenceName = "TOTO_ID_SEQ", initialValue = 1, allocationSize = 1)
public abstract class abstractEntity {

   @Id
   @Column(name = "ID")
   @GeneratedValue(generator = "TOTO_ID_SEQ", strategy = GenerationType.SEQUENCE)
   private Long id;

   @OneToOne(mappedBy = "...", fetch = FetchType.EAGER)
   private C anotherEntity;

   @OneToMany(mappedBy = "...", fetch = FetchType.LAZY)
   private List<D> anotherEntities;

   ...

}
@Embeddable
@Access(AccessType.FIELD)
public class CustomEmbeddedKey {

   @Column(name = "...", length = ...)
   private String key;

   ...
}
TypedQuery<A> query = createNamedQuery("findADetails", A.class);
  query.setParameter("customKey", queryParam);
  List<A> aEntitiesFound = query.getResultList();

共有1个答案

康赞
2023-03-14

我想我找到问题了。这是由于openJPA并不真正支持的映射,如果我们参考关于快速获取注意事项和限制的文档

最后,我有两个解决方案:

解决方案1(简单的一个):

    null
    null
    null

解决方案2:修改映射

  • 从抽象实体中删除继承的用法(实际上没有业务用法),并用@mappedsuperclass替换(因此删除@entity和@inherity)
  • 添加接口并定义热切属性的getters/setters
  • 将此接口实现到抽象实体类中,以便子类必须实现getters/setters(以及相关的属性和映射)
  • 将这些热切对象的目标实体的反向关系类型从抽象类类型更改为新接口类型
  • 最后将EAGER属性的映射、getter和setter的实现从抽象实体类移到所有子实体类。

优点:

    null

缺点:

  • 更多修改
  • 由于接口而不是抽象类类型到目标实体类中,对开发人员来说,可读性可能较低
 类似资料:
  • 问题内容: 我有四个表: 和类似的实体结构: 我需要一个查询将返回所有与它在表和孩子初始化。该是预先抓取,但孩子们是懒牵强。 我知道如何编写查询,将查询表的直接子级并相应地对其进行初始化。但是,我不知道如何获取从顶层表急切获取的表的子级。 我已经尝试过类似的东西: 但是,这总是给我一个错误,即所有者不是SELECT的一部分。 任何帮助是极大的赞赏。 问题答案: Hibernate参考 我们可能需要

  • Facebook在共享调试器上显示所有内容。不知道我还能做些什么让它获取正确的信息。 应该修复的警告 推断属性应显式提供'og: Image'属性,即使可以从其他标记推断出值。 这是一个“og:type”的专有名词。 适当的“og:url”表示明确的责任,但必须具有适当的责任。共有 应明确提供缺少“fb:App_ID”属性的应用程序ID,并指定应用程序ID,以便将共享到Facebook的故事正确归

  • 我试图在eclipse中使用owlapi创建一个本体,使用owl-osgi-distribution 4.0.2并得到一个Noclassfound错误,与链接中的错误类似 根据我得到的错误: 有了链接中的答案,我明白了我的owlapi文件需要添加,为了解决这个问题,我参考了下面的方法。 http://www.jabenitez.com/2015/08/19/solucionando-el-erro

  • 最近,我致力于数据虚拟化,以整合跨部门的数据。在搜索了几个软件之后,我决定使用Redhat JBOSS数据虚拟化,因为该软件是开源的。我已经安装了JDK、JBOSS Studio和数据虚拟化插件来运行Teiid。在那之后,我开始了Teeid模型项目的新项目,做了一些配置,所有的过程都很顺利,没有错误。但是当我准备执行最后的进程时,我发现了错误。 第一行错误消息是: 无法部署以下VDB执行:[vdb

  • 我正在尝试执行以下代码。 它正在生成以下错误。 线程“main”java.lang.NoClassDeffounder异常错误:com/google/inject/provider在java.lang.ClassLoader.DefineClass1(本机方法)在java.lang.ClassLoader.DefineClass(未知源)在java.net.URLClassLoader.Defin

  • 错误:## Tkinter回调中的异常 回溯(最近一次呼叫最后一次): 文件“C:\Users\hp-\AppData\Local\Programs\Python\Python35-32\lib\tkinter\uuuuuu init\uuuuuuuuu.py”,第1549行,在call return self中。func(*args) 文件"C:\用户\hp-\下载\pyguii.py",第12