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

HiberNate Enver失败与@转换器和属性转换器(JPA 2.1)

章鸿光
2023-03-14

我在Enver和MySql 5.6中使用HiberNate 4.3.4。

如果没有 JPA 2.1 转换器,下面的 Party 实体在 Configuration.buildSessionFactory() 上会失败,因为 Hibernate 不知道如何处理 Name 类:

@Entity
@Audited
public class Party
    {
    protected Name name;
    ...
    }

例外情况是:

org.hibernate.MappingException: 
  Could not determine type for: 
    ModuloADM.Party.Name, 
    at table: Party, for columns: [org.hibernate.mapping.Column(name)]

为了解决这个问题,我然后添加这个转换器:

@Converter (autoApply=true)
public class NametoStringConverter
      implements AttributeConverter<Name, String>
    { ... }

现在,异常变为:

org.hibernate.MappingException: 
  Could not determine type for: 
    BasicType adapter for AttributeConverter<Name,String>, 
    at table: History_Party, for columns: [org.hibernate.mapping.Column(name)]

这现在在参与方实体的Envers审计表中失败。请注意,History_Party是审核表的名称,由config.setProperty(“org.hhibernate.envers.audit_table_prefix”,“History_”)选择。

完整的堆栈跟踪是:

org.hibernate.MappingException: 
  Could not determine type for: 
    BasicType adapter for AttributeConverter<Name,String>, 
    at table: History_Party, for columns: [org.hibernate.mapping.Column(name)]

  at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:336)
    at org.hibernate.tuple.PropertyFactory.buildEntityBasedAttribute(PropertyFactory.java:246)
    at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:227)
    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:520)
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:148)
    at sun.reflect.GeneratedConstructorAccessor43.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:163)
    at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:135)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:401)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1857)

我如何解决这个问题?Envers甚至与AttributeConverters兼容吗?

共有3个答案

魏航
2023-03-14

我在异常中看到文本“Generated ConstructorAccessor43”。可能需要一个公共 void 构造函数,以便 JPA 可以创建 NametoStringConverter 的实例。

默认构造函数应该可以工作,但请检查您是否有另一个具有接收参数或不公开的构造函数。

欧阳智志
2023-03-14

这似乎是Hibernate Envers (HHH-9042)的一个已知问题。

一个简单的解决方法是手动调用Conver和一个附加的瞬态字段,如下所示:

@Entity
public class Party {

  protected Name name;

  @Transient
  protected String nameString;

  //...

  public void setName(Name name) {
    this.nameString = (new NametoStringConverter()).convertToDatabaseColumn(name);
    this.name = name;
  }

  //...

  public void setNameString(String nameString) {
    this.name = (new NametoStringConverter()).convertToEntityAttribute(nameString);
    this.nameString = nameString;
  }

}

根据转换函数,可以通过使它们静态并导入它们来进一步简化代码。

窦华晖
2023-03-14

尝试在<code>Party</code>实体中使用@Convert。有时autoApply标志不起作用

@Entity
@Audited
public class Party
    {
    @Convert(converter = NametoStringConverter.class)
    protected Name name;
    ...
    }
 类似资料:
  • 我已经从.shap文件转换了GeoJson文件。每个对象都有弧、点和一些其他特性。现在,当我试图用这个在线应用程序将这个GeoJson文件转换为TopoJson文件时http://shancarter.github.io/distillery/ 转换后的TopoJson与D3.js配合使用,但对象只有类型:多边形和圆弧属性。所有其他属性,如id、GEOFIP等都消失了。我需要这些属性,但至少需要2

  • 我使用ModelMapper将一些对象转换为复杂的DTO,反之亦然。 尽管我试图理解留档,但我发现很难理解何时使用转换器、提供程序或抽象转换器。 现在,例如,如果我想将字符串属性转换为目标DTO中的小DTO,我将在抽象转换器中手动执行。 例如: 虽然这是正确的方法吗?我应该何时使用提供商? 如果我想用条件设置属性,我可以在转换器中使用条件吗?或者只有在使用PropertyMap时才能使用条件? 此

  • 如果您需要在Aurelia应用程序中转换某些值,则可以使用converters而不是手动将值转换为所需的格式。 转换日期 当我们想要将默认日期值转换为某种特定格式时,我们可以使用momentJS库。 这是一个用于操作日期的小型库。 C:\Users\username\Desktop\aureliaApp>jspm install moment 让我们创建一个新文件converters.js 。

  • XStream转换器是XStream库的关键组件,它负责将对象转换为XML,反之亦然。 XStream为常见类型提供了大量转换器,例如基元,字符串,文件,集合,数组和日期。 使用转换器 让我们使用SingleValueConvertor,其目的是将对象转换为单个字符串。 我们将使用SingleValueConvertor将对象写为属性字符串。 创建转换器 class NameConverter i

  • 程序说明: 1. 依赖:Windows操作系统,.Net FrameWork 3.5, Office Word 2. Word另存为HTML有几种格式可以选:单个网页mht,网页htm以及筛选过的网页htm。我选择的是筛选过的html,所有公式全部转成gif或者jpg图片,稍微规范一点的htm不会含有微软中的一些恶心的格式信息。 运行界面如下: 1. 程序初始界面:   2. “Open”选择一个

  • 问题内容: 在SQL 9(2005)中创建了一个存储过程,此后已升级到SQL 10(2008)。从那时起,以下存储过程停止工作并引发上述错误: 传入的参数@vPortalUID包含:2A66057D-F4E5-4E2B-B2F1-38C51A96D385。我执行这样的存储过程: 它跌倒了。我也尝试过转换。仍然没有喜悦。也具有将{}括起来的价值。我如上所述以编程方式和手动方式删除了这些内容。 如果您