使用Eclipselink的entityManager.clear上的字段异常的多个可写映射

问题描述

我们正在定制一个外部JEE项目(不修改基本源代码,仅配置和继承)。我遇到以下异常:

Exception [EclipseLink-48] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.DescriptorExce
ption
Exception Description: Multiple writable mappings exist for the field [MY_TABLE.ERROR_CODE].  Only one may be defined
 as writable,all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[errorCodeString-->MY_TABLE.ERROR_CODE]
Descriptor: RelationalDescriptor(my.package.somwhere.DerivedClass --> [DatabaseTable(MY_TABLE)])

Runtime Exceptions:
---------------------------------------------------------

        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:593)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:205)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:305)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:337)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:303)
        at org.jboss.as.jpa.container.TransactionScopedEntityManager.createEntityManager(TransactionScopedEntityManager.java:187)
        at org.jboss.as.jpa.container.TransactionScopedEntityManager.getEntityManager(TransactionScopedEntityManager.java:91)
        at org.jboss.as.jpa.container.AbstractEntityManager.clear(AbstractEntityManager.java:331)
        at my.code.some.function.somwhere...

问题可能与以下事实有关,即ERROR_CODE列确实存在多个映射。这是原始映射:

@Entity
@Table("name="MY_TABLE")
public class BaseClass implements Serializable {
    ...
    @Column(name="TRJ_ERROR_CODE")
    private Integer errorCode;
}

已覆盖,列类型从NUMBER更改为VARCHAR2

@Entity
@DiscriminatorValue("X")
@AttributeOverrides({
        @AttributeOverride(name = "errorCode",column = @Column(name = "TRJ_ERROR_CODE",updatable = false,insertable = false))
})
public class DerivedClass extends BaseClass {
   ...
   @Column(name = "TRJ_ERROR_CODE",length = 200)
   private String errorCodeString;
}
<!--ORM.XML-->
    <entity class="my.package.somwhere.DerivedClass">
        <attributes>
            <transient name="errorCode"/>
        </attributes>
    </entity>

仅在enitityManager.clear()呼叫中发生此问题。持久实体可以正常工作。调试eclipselink SessionCustomizer仅显示一个映射-第二个映射来自何处?我如何禁用原来的一个?我找不到具有org.eclipse.persistence.mappings.DirectToFieldMapping而非OneToManyOneToOne等关系的此问题的任何示例。

使用以下代码片段插入实体管理器:

@PersistenceContext(unitName = SomeConstants.PERSISTANCE_JTA_UNIT_CODE,type = PersistenceContextType.TRANSACTION)
private EntityManager entityManager;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...