问题描述
我有以下实体:
function equal(a,b,c){
return a==b && b==c;
}
当我尝试将新的@Entity
@Audited
public class Item implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
private String guid;
@OnetoMany(mappedBy = "item",cascade = CascadeType.ALL,orphanRemoval = true)
@MapKey(name="fieldName")
private Map<String,CustomField> customFields = new HashMap<>();
}
@Entity
@Audited
public class CustomField {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "field_name")
@NotNull
private String fieldName;
@Column(name = "field_value")
@NotNull
private String fieldValue;
@ManyToOne(fetch = FetchType.LAZY,optional = false,targetEntity= Item.class)
@JoinColumn(name = "item_guid",referencedColumnName = "guid")
private Item item;
}
添加到CustomField
时,已经有些像这样了:
Item
它导致以下错误:
Item item = new Item();
item.setGuid(UUID.randomUUID().toString());
Transaction tx = session.beginTransaction();
Serializable id = session.save(item);
tx.commit();
CustomField field = new CustomField();
field.setFieldName("test_field");
field.setFieldValue("test");
field.setItem(item);
item.getCustomFields().put(field.getFieldName(),field);
Transaction tx2 = session.beginTransaction();
session.persist(item);
tx2.commit();
Transaction tx3 = session.beginTransaction();
Item item2 = session.get(Item.class,id);
CustomField field2 = new CustomField();
field2.setFieldName("test_field_2");
field2.setFieldValue("test_2");
field2.setItem(item2);
item.getCustomFields().put(field2.getFieldName(),field2);
session.persist(item2);
tx3.commit();
我正在使用Hibernate(和Envers)版本javax.persistence.PersistenceException: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.String org.hibernate.envers.bugs.Item.guid] by reflection for persistent property [org.hibernate.envers.bugs.Item#guid] : test_field
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1463)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:514)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3321)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2492)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:178)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:271)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104)
at org.hibernate.envers.bugs.EnversUnitTestCase.hhh123Test(EnversUnitTestCase.java:93)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.hibernate.testing.junit4.ExtendedFrameworkMethod.invokeExplosively(ExtendedFrameworkMethod.java:45)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)
at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.String org.hibernate.envers.bugs.Item.guid] by reflection for persistent property [org.hibernate.envers.bugs.Item#guid] : test_field
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:75)
at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:59)
at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:65)
at org.hibernate.tuple.component.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:90)
at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:436)
at org.hibernate.type.ComponentType.isSame(ComponentType.java:165)
at org.hibernate.envers.internal.entities.mapper.relation.MapCollectionMapper.isSame(MapCollectionMapper.java:128)
at org.hibernate.envers.internal.entities.mapper.relation.MapCollectionMapper.mapCollectionChanges(MapCollectionMapper.java:156)
at org.hibernate.envers.internal.entities.mapper.relation.AbstractCollectionMapper.mapCollectionChanges(AbstractCollectionMapper.java:147)
at org.hibernate.envers.internal.entities.mapper.MultiPropertyMapper.mapCollectionChanges(MultiPropertyMapper.java:256)
at org.hibernate.envers.event.spi.BaseEnversCollectionEventListener.generateFakeBidirecationalRelationWorkUnits(BaseEnversCollectionEventListener.java:204)
at org.hibernate.envers.event.spi.BaseEnversCollectionEventListener.onCollectionAction(BaseEnversCollectionEventListener.java:68)
at org.hibernate.envers.event.spi.BaseEnversCollectionEventListener.onCollectionActionInversed(BaseEnversCollectionEventListener.java:123)
at org.hibernate.envers.event.spi.EnversPreCollectionUpdateEventListenerImpl.onPreUpdateCollection(EnversPreCollectionUpdateEventListenerImpl.java:37)
at org.hibernate.action.internal.CollectionUpdateAction.preUpdate(CollectionUpdateAction.java:111)
at org.hibernate.action.internal.CollectionUpdateAction.execute(CollectionUpdateAction.java:57)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1457)
... 24 more
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field org.hibernate.envers.bugs.Item.guid to java.lang.String
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:393)
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:71)
... 44 more
。所有指针均已确定。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)