我使用的是带有Envers的Hibernate 4.3.4和MySql 5.6。
如果没有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)]
现在,Party
实体的Envers审计表失败。请注意,History_Party
是审计表的名称,由config.setProperty("org.hibernate.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兼容?
5条答案
按热度按时间ddrv8njm1#
我也遇到了同样的问题,我发现只有当我没有将columnDefinition =“VARCHAR(255)”的@Column注解放到枚举中时,才会出现这种问题。所以我认为这是一个比Hibernate跟踪器中更好的解决方法。
0s7z1bwu2#
如果需要为列指定列名(在本例中为“C_NAME”),则需要添加@Column注解。
请注意,以下代码将不起作用,并将导致“无法确定以下项的类型:“错误,因为将忽略Converter注解。
4si2a6ki3#
尝试在
Party
实体中使用@Convert。有时autoApply
标志不起作用xam8gpfp4#
这似乎是一个known problem with Hibernate Envers (HHH-9042)。
一个简单的解决方法是手动调用“转换器”和一个附加的瞬变字段,如下所示:
根据转换函数的不同,可以通过将其转换为
static
并导入来进一步简化代码。pengsaosao5#
我在异常中看到文本“GeneratedConstructorAccessor43”。可能您需要一个公共void构造函数,以便JPA可以创建NametoStringConverter的示例。
默认的构造函数应该可以工作,但是要检查是否有另一个带有receives参数的构造函数或者它不是public的。