我生活在一场噩梦中,这是一种依赖性的噩梦;)
我正在测试使用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
* 作为Arquillian测试(EJB作为JAR收缩包装在EAR中),部署到嵌入式JBOSS 7(jboss.as.jpa.managed=false
)。 它在那里不起作用。我尝试过各种依赖项集,但这是我确定需要的最小集合:
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() ...
非常感谢您的帮助!
答案 0 :(得分: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/
答案 1 :(得分:0)
回答我自己的问题。
简而言之,我试图做的事情:
UserType
s)在WebSphere中部署时,应用程序中的UserType
需要与Hibernate 3兼容,并且在JBOSS中进行测试时需要与Hibernate 4兼容。事实证明,UserType
规范已经发生了很大变化,以至于它与这种或那种方式不相容。 (如果不是这样,混合这些版本仍然是一个坏主意,但它可能需要更长时间才能变得明显。)这种混合导致了another question中描述的错误。但即使在这个问题中我接受了解决方案,我也遇到了一堆错误,他们使用时髦的依赖管理解决了这些问题,但总是遇到某种问题。
如果JPA是合同(在您的应用程序和容器之间),那么就不要依赖容器如何实现该合同(例如Hibernate)。
如果我在应用程序中提供持久性,那将是一个完全不同的故事。
有时当你处于中间位置时,很难看到全局:)