【问题标题】:Parameter value element [...] did not match expected type [org.hibernate.type.EnumType]参数值元素 [...] 与预期类型 [org.hibernate.type.EnumType] 不匹配
【发布时间】:2013-09-18 11:52:38
【问题描述】:

我生活在噩梦中,这是一个依赖的噩梦;)

我正在测试一个使用 Hibernate 3 的 EJB 应用程序。

我要么部署它:

  • 在 WebSphere 8(EAR 中内置的 EJB JAR)上,这是我想要的目标环境。 它在那里工作得很好。根据我们组织的标准,(Hibernate)依赖项是通过一个单独的过程来处理的。看来我在那里得到了以下 Hibernate 依赖项:

    • org.hibernate:hibernate-validator:3.1.0.ga
    • org.hibernate:hibernate-search:3.1.1.ga
    • org.hibernate:hibernate-entitymanager:3.4.0.ga
    • org.hibernate:hibernate-commons-annotations:3.1.0.ga
    • org.hibernate:hibernate-annotations:3.4.0.ga
    • org.hibernate:hibernate-c3p0:3.3.2.ga *
    • org.hibernate:hibernate-core:3.3.2.ga *
    • org.hibernate:hibernate-ehcache:3.3.2.ga *
    • org.hibernate:hibernate-jbosscache:3.3.2.ga *
    • org.hibernate:hibernate-jbosscache2:3.3.2.ga *
    • org.hibernate:hibernate-jmx:3.3.2.ga *
    • org.hibernate:hibernate-oscache:3.3.2.ga *
    • org.hibernate:hibernate-proxool:3.3.2.ga *
    • org.hibernate:hibernate-swarmcache:3.3.2.ga *
  • 作为部署到嵌入式 JBOSS 7 (jboss.as.jpa.managed=false) 的 Arquillian 测试(EJB 作为压缩在 EAR 中的 JAR)。 它在那里不起作用。我尝试了各种依赖项集,但这是我确定我需要的最小集:

    • org.hibernate:ejb3-persistence:jar:1.0.2.GA
    • org.hibernate:hibernate-annotations:jar:3.4.0.GA
    • org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final
    • org.hibernate:hibernate-c3p0:3.3.2.ga *
    • org.hibernate:hibernate-core:3.3.2.ga *
    • org.hibernate:hibernate-ehcache:3.3.2.ga *
    • org.hibernate:hibernate-jbosscache:3.3.2.ga *
    • org.hibernate:hibernate-jbosscache2:3.3.2.ga *
    • org.hibernate:hibernate-jmx:3.3.2.ga *
    • org.hibernate:hibernate-oscache:3.3.2.ga *
    • org.hibernate:hibernate-proxool:3.3.2.ga *
    • org.hibernate:hibernate-swarmcache:3.3.2.ga *

这是我得到的错误:

java.lang.IllegalArgumentException: Parameter value element [INCLUDED] did not match expected type [org.hibernate.type.EnumType]
    at org.hibernate.ejb.AbstractQueryImpl.validateCollectionValuedParameterMultiBinding(AbstractQueryImpl.java:385)
    at org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:363)
    at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:343)
    at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:370)
    at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:67)
    ...

这是我正在执行的代码:

MyStatusEnum[] statuses = ...;
String queryString = "from MyEntity where statusCode in (:statuses)";
Query query = getEntityManager().createQuery(queryString);
query.setParameter("statuses", Arrays.asList(statuses));

实体字段如下所示:

@Column(name="STATUS_CD", nullable=false)
@Enumerated(EnumType.STRING)
public MyStatusEnum getStatusCode() ...

非常感谢您的帮助!

【问题讨论】:

  • 老实说,我认为您需要在这里重新考虑使用 JBoss AS 7 来运行您的集成测试。如果您的生产环境是 WebSphere 8,那么您应该尝试在您的集成测试环境中使用它。在 AS7 上运行它不会给您的测试套件带来很大的信心,因为整个堆栈在运行时的行为不同。我建议使用 Arquillian WebSphere container adapter。 AFAIK,您需要从源代码构建此适配器(应该很容易,因为您可能可以访问这些库)。

标签: java hibernate maven jpa jboss-arquillian


【解决方案1】:

这个错误也发生在我身上,使用 Hibernate 5.2.14.Final。事实上,我怀疑这是由于 Glassfish 4.x 中的其他一些依赖项与其他库的交互造成的。

我实现了绕过错误的解决方案,将@Enumerated(EnumType.STRING) 替换为属性转换器(实现javax.persistence.AttributeConverter)。

调整后您的映射将与此类似:

@Column(name="STATUS_CD", nullable=false)
@Convert(converter = MyStatusEnumConverter.class)
public MyStatusEnum getStatusCode() ...

有关在 JPA 中实现属性转换器的更多信息,请访问以下链接:https://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/

【讨论】:

    【解决方案2】:

    回答我自己的问题。

    简而言之,我想做的是:

    • 在我们使用 Hibernate 3 设置的 WebSphere 上运行应用程序
    • 在强绑定到 Hibernate 4 的 JBOSS 7 上测试应用程序
    • 让容器提供持久性
    • 使用单个 Hibernate(非 JPA)构造 (UserTypes)

    在 WebSphere 中部署时,应用程序中的 UserType 需要与 Hibernate 3 兼容,而在 JBOSS 中进行测试时,它需要与 Hibernate 4 兼容。事实证明,UserType 规范已经发生了足够的变化因为它以某种方式不兼容。 (如果不是这样,混合这些版本仍然是一个坏主意,但可能需要更长的时间才能变得明显。)这种混合导致了another question 中描述的错误。但即使在那个问题中使用了公认的解决方案,我还是遇到了一堆错误,用时髦的依赖管理解决了这些错误,但总是遇到某种问题。

    如果 JPA 是合约(在您的应用程序和容器之间),则不要依赖容器如何实现该合约(例如 Hibernate)。

    如果我要在应用程序中提供持久性,那将是一个完全不同的故事。

    有时当你身处事情的正中间时,很难看到大局:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 2019-03-13
      • 2021-08-05
      • 2016-07-13
      • 1970-01-01
      • 2018-09-02
      • 2016-04-22
      相关资源
      最近更新 更多