java - Hibernate UUIDTypeDescriptor$ToBytesTransformer.parse() 方法中出现意外的 ArrayIndexOutOfBoundsException

标签 java hibernate jpa jboss7.x ubuntu-10.04

我正在使用 Java 6 和 hibernate-core-4.0.0.final.jar 以及 hibernate-commons-annotations-4.0.1.Final.jar 和 hibernate-jpa-2.0-api-1.0.1.Final。 jar

我有一个以 java.util.UUID 列作为 PK 的实体。 PK 不是由 hibernate 自动生成的。相反,我设置要创建或更新的记录的 ID。我从发送到我们服务器的请求数据中获取 ID。让我们假设一个使用我们的 API 的应用程序推送一个带有 uuid 作为字符串的记录。在我们的服务器上,我们保留该记录。

问题是我在调用合并时得到一个 ArrayOutOfBoundException。这种情况只是有时发生,我不知道涉及什么。我一直在尝试重现该错误,但尚未成功。

这是我在服务器日志中看到的堆栈跟踪。我们应用程序中的行是

getEntityManager().merge(record)

stackTrace 如下:

    java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method) [rt.jar:1.6.0_31]
at org.hibernate.type.descriptor.java.UUIDTypeDescriptor$ToBytesTransformer.parse(UUIDTypeDescriptor.java:128) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.type.descriptor.java.UUIDTypeDescriptor.wrap(UUIDTypeDescriptor.java:80) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.type.descriptor.java.UUIDTypeDescriptor.wrap(UUIDTypeDescriptor.java:37) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.java:67) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:65) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:269) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:265) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:238) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:357) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:702) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:635) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.doQuery(Loader.java:856) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.loadEntity(Loader.java:2058) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3697) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:439) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:420) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:954) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:903) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:610) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.type.EntityType.resolve(EntityType.java:438) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:150) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1006) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.doQuery(Loader.java:883) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.Loader.loadEntity(Loader.java:2058) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3697) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:439) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:420) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:954) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:870) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:460) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:256) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:86) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:781) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:766) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:770) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:867) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
at org.jboss.as.jpa.container.AbstractEntityManager.merge(AbstractEntityManager.java:548) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]

在此先感谢您的帮助。

最佳答案

在从 Long (number(18)) 迁移到 java.util.UUID (原始(16))。我使用调试器代理启动 Tomcat:

$ /opt/apache-tomcat-7.0.40/bin/catalina.sh jpda start

在 Netbeans 中下载 Hibernate 源代码,在 UUIDTypeDescriptor$ToBytesTransformer.parse() 设置断点(访问源代码并双击该行)并使用 Netbeans 调试器附加到 Tomcat。

我认为 value 的内容:

public UUID parse(Object value) {
    ...
    System.arraycopy( value, 0, msb, 0, 8 );

传递了byte[4]数组!我重新考虑并意识到我忘记更改 @Id 字段上的列名:

@Id
@NotNull
@Column(name = "UUID") // <-- here I fix name!
private UUID uuid;

关于java - Hibernate UUIDTypeDescriptor$ToBytesTransformer.parse() 方法中出现意外的 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16409557/

相关文章:

java - 在子列表上调用 size() 时出现 ConcurrentModificationException

sql-server - 集成 Spring + Hibernate + Sql 服务器并支持 unicode

java - 使用 ParameterExpression 作为 In 子句的一部分

java - 从 java 源文件创建可执行文件,以在 Windows 7 上运行

sql - 如何使用 hibernate 记录最终的 SQL 查询

java - 如何让 Spring Converter 抛出自定义异常而不是 ConversionFailedException?

java - 首次发布应用程序时,持久性单元无法注入(inject),但重新启动应用程序时注入(inject)成功

java - 使可嵌入类的字段从 JPA 中的嵌入类 transient 化

java - spring Cglib 很有用,但 @Transactional 类不代理

java - JPA 标准查询。如何摆脱字符串参数。在 criteria api 中构建不带字符串的查询。输入安全查询