Tomee的OpenEJB Query实现与Hibernate不完全兼容

时间:2015-02-26 08:21:52

标签: hibernate jpa jboss openejb tomee

我偶然发现了OpenEJB(即JtaQuery)中javax.persistence.Query的实现问题,我倾向于认为这是一个错误,但也许我错了。 我有这段代码:

final Query fakeLoginQuery = this.systemSettingsEM
                .createNativeQuery("select value from SystemSettings where Name = 'IAM_FAKE_LOGIN'");
fakeLoginQuery.unwrap(SQLQuery.class).addScalar("value", StringType.INSTANCE);
final String fakeLogin = (String) fakeLoginQuery.getSingleResult();

现在不要问我为什么要在第2行做这件事(看起来,虽然我正在为我的SQL Server指定方言,这里 - 而且只是来自所有代码库 - hibernate正在使用简单的方言,而不是指定的方言,但这是另一个问题)

在Tomee 中,来自OpenEJB(JtaQuery)的java.persistence.Query的实现从unwrap()返回一个实例,该实例与执行fakeLoginQuery.getSingleResult()时委托的实例不同。显然,它委托给它的实例没有类型映射集,并且它与可怕的内容大喊:

org.hibernate.MappingException: No Dialect mapping for JDBC type: -9

-9是nvarchar。

在JBoss中这件事情完美无缺,这意味着org.hibernate.SQLQuery返回的unwrap()实例与fakeLoginQuery.getSingleResult()委托给的实例相同。

为什么OpenEJB会这样做?或者是另一种方式,JBOss的Query实现只是因为“它知道”hibernate的方式吗?

1 个答案:

答案 0 :(得分:0)

请尝试以下两种方式:
方法1.将StringType.INSTANCE更改为Hibernate.STRING,如下所示:
fakeLoginQuery.unwrap(SQLQuery.class).addScalar("value", Hibernate.STRING);
方式2.创建自己的Hibernate方言,例如,如下:
fakeLoginQuery.unwrap(SQLQuery.class).addScalar("value", Hibernate.STRING);

:)