当前位置: 首页 > 知识库问答 >
问题:

Spring、JPA、Postgresql-无法将自定义类型用作ID

湛财
2023-03-14

我有例外:

组织。postgresql。util。PSQLException:错误:运算符不存在:uuid=bytea
提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。

我有JPA实体

@Entity(name = "products")
class JpaProductEntity {

    @Id
    private ProductId id;

    private String payload;

    private Integer version;

    public JpaProductEntity() {
    }

    public void setId(ProductId id) {
        this.id = id;
    }

    public String getPayload() {
        return payload;
    }

    public void setPayload(String payload) {
        this.payload = payload;
    }

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }
}

Id类

 public class ProductId  implements Serializable {

    private static final long serialVersionUID = -6110163899364126142L;

    private String identifier;

    public ProductId(String identifier) {
        this.identifier = identifier;
    }

    public static ProductId from(String identifier) {
        Assert.notNull(identifier, "Identifier cannot be null");
        return new ProductId(identifier);
    }

    public static ProductId generate() {
        return new ProductId(Id.generateIdentifier());
    }
}

此外,转换器:

@Converter(autoApply = true)
public class ProductIdPostgresUuidConverter implements AttributeConverter<ProductId, UUID> {

    @Override
    public UUID convertToDatabaseColumn(ProductId attribute) {
        return UUID.fromString(attribute.toString());
    }

    @Override
    public ProductId convertToEntityAttribute(UUID dbData) {
        return ProductId.from(dbData.toString());
    }
}

看起来,转换器根本不工作(我在转换器方法中设置了断点,但什么也没发生,调试器并没有进入那个里)。

共有1个答案

徐景明
2023-03-14

试试这个:

@Entity(name = "products")
class JpaProductEntity {

  @Type(type = "pg-uuid") // tells what type will be internally used by DB
  // Definitely need to instruct JPA to use your converter
  @Convert(converter = ProductIdPostgresUuidConverter.class)
  @Id
  private ProductId id;

}

提示:对于同一类型,您可能有多个转换器,由您自行决定使用。您确实需要明确地告诉JPA使用哪一个。

 类似资料:
  • 问题的核心似乎是Eclipselink中没有到类型的内部映射。因此,使用一种简单的方法: ...在尝试插入一个对象时,我遇到了一个异常: 我想很公平。 通过查看EclipseLink文档,似乎适用的定制(转换映射、本机查询、转换器)依赖于由所支持的映射(数字、日期、字符串等)组成的数据,因此使用特定于供应商的类型很难做到这一点。 这是如此令人沮丧的主要原因是,posgresql中的类型与text/

  • 我有一个实体Person,它有一个属性Name。name没有被标记为实体。对于Name类,我有一个属性转换器,它通过名字和姓氏的字符串连接创建一个全名。所以对于个人实体,列名是字符串类型。 这是可行的。但现在我想扩展我的个人存储库。我想按她的姓找人。但是 或 不起作用。我得到以下例外: 我怎样才能解决这个问题?谢谢和问候 编辑:

  • Rust 自定义数据类型主要是通过下面这两个关键字来创建: struct: 定义一个结构体 enum: 定义一个枚举类型 而常量的创建可以通过 const 和 static 关键字来创建。

  • 存在多种方法来重新定义现有类型的行为以及提供新的类型。 重写类型编译 一个常见的需求是强制更改类型的“字符串”版本,即在create table语句或其他SQL函数(如cast)中呈现的版本。例如,应用程序可能希望强制呈现 BINARY 适用于除一个平台外的所有平台 BLOB 待渲染。在本例中,使用现有的泛型类型 LargeBinary ,是大多数用例的首选。但是为了更准确地控制类型,每个方言的编

  • 1. 包含头文件 #import <AdHubSDK/AdHubSDK.h> 2. AdHubCustomView 的创建和初始化 在需要导入广告的ViewController头文件中导入头文件并声明实例以及声明代理 #import <AdHubSDK/AdHubSDK.h> @interface AdHubCustomViewController ()<AdHubCustomViewDele

  • 问题内容: 我有一堂课: 我想在“ JPA”专栏中使用它: 这就是Hibernate所说的: 如何使其了解我的自定义类型。我认为这很简单,但是在文档中找不到。 问题答案: 好吧,有很多方法: 用注释类,并具有: private Email email; 声明自定义值类型-参见此处(使用)