【问题标题】:moving from hibernate to openjpa: Errors encountered while resolving metadata从 hibernate 迁移到 openjpa:解析元数据时遇到的错误
【发布时间】:2012-03-28 12:08:18
【问题描述】:

我在一个使用 hibernate 的项目中工作,我的工作是将它切换到 openjpa(因为它将被集成到另一个已经使用 openjpa 的更大的项目中)。

现在,在运行我的测试时,我收到一条错误消息:

eu.ist_phosphorus.harmony.idb.exceptions.database.DatabaseException: Errors encountered while resolving metadata.  See nested exceptions for details.
...
...
at eu.ist_phosphorus.harmony.idb.database.hibernate.Domain.save(Domain.java:878)
at
eu.ist_phosphorus.harmony.idb.database.hibernate.Domain$4.dbOperation(Domain.java:885)
at
eu.ist_phosphorus.harmony.idb.database.TransactionManager.start(TransactionManager.java:108)
... 30 more
...
Caused by: <openjpa-2.2.0-r422266:1244990 fatal user error> org.apache.openjpa.persistence.ArgumentException: Errors encountered while resolving metadata.  See nested exceptions for details.
FailedObject: eu.ist_phosphorus.harmony.idb.database.hibernate.Domain@17bf9b45 [java.lang.String]
at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:668)
at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:411)
at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:384)
at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:248)
at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:105)
at org.apache.openjpa.kernel.BrokerImpl.attach(BrokerImpl.java:3474)
at org.apache.openjpa.kernel.DelegatingBroker.attach(DelegatingBroker.java:1214)
at org.apache.openjpa.persistence.EntityManagerImpl.merge(EntityManagerImpl.java:878)
at eu.ist_phosphorus.harmony.idb.database.hibernate.Domain.save(Domain.java:878)
at eu.ist_phosphorus.harmony.idb.database.hibernate.Domain$4.dbOperation(Domain.java:885)
at eu.ist_phosphorus.harmony.idb.database.TransactionManager.start(TransactionManager.java:108)
... 30 more
 Caused by: <openjpa-2.2.0-r422266:1244990 fatal user error> org.apache.openjpa.persistence.ArgumentException: "eu.ist_phosphorus.harmony.idb.database.hibernate.Domain.endpoints<key:class java.lang.Object>" declared that it is mapped by "TNA", but that is a not a field of the related type.
at org.apache.openjpa.meta.ValueMetaDataImpl.getValueMappedByMetaData(ValueMetaDataImpl.java:329)
at org.apache.openjpa.jdbc.meta.ValueMappingImpl.getValueMappedByMapping(ValueMappingImpl.java:121)
at org.apache.openjpa.jdbc.meta.ValueMappingImpl.getColumns(ValueMappingImpl.java:130)
at org.apache.openjpa.jdbc.meta.ValueMappingImpl.resolveMapping(ValueMappingImpl.java:518)
at org.apache.openjpa.jdbc.meta.ValueMappingImpl.resolve(ValueMappingImpl.java:500)
at org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:522)
at org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:461)
at org.apache.openjpa.jdbc.meta.ClassMapping.resolveMapping(ClassMapping.java:854)
at org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1802)
at org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:822)
at org.apache.openjpa.meta.MetaDataRepository.resolveMapping(MetaDataRepository.java:777)
at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:657)
... 40 more

错误是由之前是 SessionManager.saverOrUpdate() 的 EntityManager.merge() 触发的。我知道这些方法的工作方式有点不同,但是由于错误,它似乎不是问题持续存在,而是在那之前。

从 hibernate 迁移到 openjpa 时,我没有过多地接触实体,我删除了一些 @Proxy(lazy = false) 注释并更改了标准 api 调用。

一侧的映射:

@Id
public String getTNA() {
    return this.TNA;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fkDomainName")
public Domain getDomain() {
    return this.domain;
}

以及另一边的映射:

@OneToMany(mappedBy = "domain", fetch = FetchType.LAZY, cascade = { javax.persistence.CascadeType.REMOVE })
@MapKey(name = "TNA")
public Set<Endpoint> getEndpoints() {
    return this.endpoints;
}

更新-我已经将 entityManager.merge() 更改为 persist(),但我仍然遇到同样的问题

我还注意到集合不是 .这会在迁移到 openjpa 时导致问题吗?

【问题讨论】:

  • 你能发布 eu.ist_phosphorus.harmony.idb.database.hibernate.Domain.endpoints 的注释吗?
  • 嗨瑞克。我添加了端点的映射。
  • 你也可以发布 Endpoint.domain 吗?
  • 尝试删除@MapKey,我不知道为什么会这样?
  • 当项目使用休眠时,它的工作方式就是这样。作为一个 jpa 注释,它的行为在 jpa 提供者之间应该是相同的吗?

标签: hibernate persistence openjpa


【解决方案1】:

尝试删除@MapKey。我认为在这种情况下使用它是不正确的。

@MapKey 注解用于为 java.util.Map 类型的关联指定映射键 当映射键本身是主键或作为映射值的实体的持久字段或属性时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 2020-03-07
    • 2017-07-10
    • 2019-04-08
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多