Eclipselink试图在MSSQL上将UUID隐蔽到字节[]中。

问题描述 投票:0回答:1

我有我的实体类。

@Entity
@Table(name = "TABLE")
public class User {

    @Id
    @Column
    private UUID id;

我用的是EclipseLink. 当我尝试执行以下代码时。

em.createQuery("select t from Table").getResultList();

我得到了一个异常:

Caused by: org.eclipse.persistence.exceptions.ConversionException: 异常描述:对象[9ABCC78A]是由Eclipse.persistence.exception.ConversionException引起的。在 org.eclipse.persistence.exception.ConversionException.couldNotBeConverted(ConversionException.java:78) ~[?:?] 在 org.eclipse.persistence.internal.helper.Helper.buildBytesFromHexString(Helper. java:266) ~[?:?] at org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToByteArray(ConversionManager.java:326) ~[?:? DatasourcePlatform.convertObject(DatasourcePlatform.java:179) ~[?:?] at org.eclipse.persistence.internal.descriptors.ObjectBuilder.extractPrimaryKeyFromRow(ObjectBuilder.java:3104) ~[?:? buildObject(ObjectLevelReadQuery.java:805) ~[?:?] 在 org.eclipse.persistence.query.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:962) ~[?:?] eclipse.persistence.query.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:573) ~[?:?] at org.eclipse.persistence.query.ObjectLevelReadQuery. executeDatabaseQuery(ObjectLevelReadQuery.java:1175) ~[?:?] at org.eclipse.persistence.query.DatabaseQuery.execute(DatabaseQuery.java:904) ~[?:?] eclipse.persistence.query.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1134) ~[?:?] at org.eclipse.persistence.query.ReadAllQuery. execute(ReadAllQuery.java:460) ~[?:?] at org.eclipse.persistence.query.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1222) ~[?:?] eclipse.persistence.internal.session.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) ~[?:?] at org.eclipse.persistence.internal.session.AbstractSession.executeQuery(AbstractSession.java:1857) ~[? java:1839) ~[?:?] at org.eclipse.persistence.internal.session.AbstractSession.executeQuery(AbstractSession.java:1804) ~[?:?] 内部.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258) ~[?:?] at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:473) ~[? 61 更多

我曾试着添加 AttributeConverter<UUID, String> 中的异常,但我得到的是同样的异常

<converter class="com.example.UuidConverter" auto-appy="true"/>

转换器中的 "技巧 "在PostgreSQL中工作得很好(我需要有 AttributeConverter<UUID, UUID>因为JDBC驱动返回UUID),但是在MSSQL上,我没有找到有效的解决方案。

如何处理这种情况,使我的实体也支持MSSQL?

java sql-server jpa eclipselink uuid
1个回答
0
投票

有一个小窍门,我希望这能帮助其他一些有同样问题的人。

步骤#1 创建一个类转换器

import org.eclipse.persistence.internal.helper.DatabaseField;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.DirectCollectionMapping;
import org.eclipse.persistence.mappings.converters.Converter;
import org.eclipse.persistence.sessions.Session;

import java.util.UUID;

public class MyUUIDConverter implements Converter {

    @Override
    public Object convertObjectValueToDataValue(Object o, Session session) {
        return o;
    }

    @Override
    public UUID convertDataValueToObjectValue(Object o, Session session) {
        return (UUID) o;
    }

    @Override
    public boolean isMutable() {
        return true;
    }

    @Override
    public void initialize(DatabaseMapping databaseMapping, Session session) {

        final DatabaseField field;

        if (databaseMapping instanceof DirectCollectionMapping) {

            // handle @ElementCollection...

            field = ((DirectCollectionMapping) databaseMapping).getDirectField();

        } else {

            field = databaseMapping.getField();

        }

        field.setSqlType(java.sql.Types.OTHER);

        field.setTypeName("java.util.UUID");

        field.setColumnDefinition("your column name in database");

    }
}

步骤#2 使用注解转换器来实现你最近创建的类。

@Entity
@Table(name = "TABLE")
@Converter(name = "myUuidConverter", converterClass = MyUUIDConverter.class)
public class User {

步骤#3 在您的属性中使用注解转换。

@Convert("myUuidConverter")
  private UUID id;
© www.soinside.com 2019 - 2024. All rights reserved.