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

在Hibernate中的复合@JoinClons上使用属性转换器

华甫
2023-03-14

当目标实体使用复合连接时,其中一列是使用转换器的自定义类型,Hibernate(使用Spring Boot JPA)无法插入。

简化实体定义:

@Entity
data class MyConfiguration(
    @Id
    val configurationId: Long,
    val enabled: Boolean,
    @OneToMany(
        cascade = [CascadeType.ALL],
        fetch = FetchType.EAGER,
        orphanRemoval = true,
        mappedBy = "id.configurationId"
    )
    val tables: Set<SourceTable>
)

@Embeddable
data class SourceTableId(
    val configurationId: Long,
    @Convert(converter = TableIdConverter::class)
    val tableId: TableId
) : Serializable

@Entity
data class SourceTable(
    @EmbeddedId
    val id: SourceTableId,
    @OneToMany(
        cascade = [CascadeType.ALL],
        fetch = FetchType.EAGER,
        orphanRemoval = true
    )
    @JoinColumns(
        JoinColumn(name = "configurationId", referencedColumnName = "configurationId", updatable = false),
        JoinColumn(name = "tableId", referencedColumnName = "tableId", updatable = false)
    )
    val groupingFields: Set<TableGroupField> = emptySet()
)

@Embeddable
data class TableGroupFieldId(
    val configurationId: Long,
    @Convert(converter = TableIdConverter::class)
    val tableId: TableId,
    val fieldName: String
) : Serializable

@Entity
data class TableGroupField(
    @EmbeddedId
    val id: TableGroupFieldId
)

converter类使用简单的字符串操作,TableId类实现可序列化。从Spring Boot应用程序的上下文中保存元素时,出现以下异常:

... Omitted for readability ...
Caused by: javax.persistence.RollbackException: Error while committing the transaction
    at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:81) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:562) ~[spring-orm-5.3.8.jar:5.3.8]
    ... 33 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke "java.util.Comparator.compare(Object, Object)" because the return value of "org.hibernate.type.descriptor.java.JavaTypeDescriptor.getComparator()" is null
    at org.hibernate.type.AbstractStandardBasicType.compare(AbstractStandardBasicType.java:211) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    at org.hibernate.type.ComponentType.compare(ComponentType.java:217) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
... Omitted for readability ...

我验证了将TableId列更改为简单字符串可以解决问题。我还应该应用什么来使其与此连接查询一起工作吗?

共有1个答案

濮冠宇
2023-03-14

在这种情况下,id或id部分上的转换器只能意外工作。这方面有一个悬而未决的问题:https://hibernate.atlassian.net/browse/HHH-8820

 类似资料:
  • 问题内容: hibernate中的property标签的lazy属性允许按照以下链接延迟加载属性:http : //docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping- declaration -属性 lazy(可选-默认为false):指定在首次访问实例变量时应延迟获取此属性。它需要构建时字节码检测

  • 在我的PostgreSQL 12.2 PostGIS 2.5.4中,我有一个名为Address的表,其列类型为 我正在使用Hibernate Sspace al并尝试开发一个属性转换器,以从我的Sspace al位置对象创建预期的Point对象。 空间位置基本上具有坐标信息: 这是我制作的PointFactory组件: 这是PointConverter: 下面是如何在Address类上设置属性:

  • 假设我想要一个复合键作为采购订单实体的street,city。 下面是我如何识别做这件事, 我想明白@AttributeOverrides注释到底是做什么的?即使我将colomn name更改为something STREET1,我仍然看到使用列名street创建的表。那么column=@column(name=“street”))在这里做什么。 另外,我可以将它作为PurchaseOrder类的

  • 我在Enver和MySql 5.6中使用HiberNate 4.3.4。 如果没有 JPA 2.1 转换器,下面的 实体在 上会失败,因为 Hibernate 不知道如何处理 Name 类: 例外情况是: 为了解决这个问题,我然后添加这个转换器: 现在,异常变为: 这现在在实体的Envers审计表中失败。请注意,是审核表的名称,由选择。 完整的堆栈跟踪是: 我如何解决这个问题?Envers甚至与A

  • 我试图配置Tomcat 8使用Log4j2进行日志记录。 我找到了使用Log4j登录Tomcat的参考资料。它提供了一个示例log4j。将Log4j配置为与Tomcat的内部日志匹配的属性文件。对于Log4j2来说,大部分转换看起来非常简单,但最后将记录器映射到appender的部分让我感到困惑: 是否有人将此配置转换为使用Log4j2?我一直在使用Log4j2配置文档,并且已经阅读了Log4j2

  • 我正在尝试开发一个ElasticSearch聚合查询,它根据嵌套对象中的属性执行结果的组合。 将为索引设置相应的映射。 我需要的查询如下所示: 查询需要按嵌套属性的名称分组,但从根对象的bin属性分组,这似乎在ElasticSearch中引起了一些麻烦。 当尝试进行以下预固化时: 此上下文似乎不允许基于产品对象的根对项目进行装箱。 ManufacturerName中指定的ManufacturerN