从hibernate移动到openjpa:解析元数据时遇到错误

从hibernate移动到openjpa:解析元数据时遇到错误,hibernate,persistence,openjpa,Hibernate,Persistence,Openjpa,我在一个使用hibernate的项目中工作,我的工作是将它切换到openjpa(因为它将被集成到另一个已经使用openjpa的更大项目中) 现在,当运行我的测试时,我得到一个错误,说: eu.ist_phosphorus.harmony.idb.exceptions.database.DatabaseException: Errors encountered while resolving metadata. See nested exceptions for details. ... ...

我在一个使用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
另一侧的映射:

@OneToMany(mappedBy = "domain", fetch = FetchType.LAZY, cascade = { javax.persistence.CascadeType.REMOVE })
@MapKey(name = "TNA")
public Set<Endpoint> getEndpoints() {
    return this.endpoints;
}
@OneToMany(mappedBy=“domain”,fetch=FetchType.LAZY,cascade={javax.persistence.CascadeType.REMOVE})
@MapKey(name=“TNA”)
公共集getEndpoints(){
返回此.endpoints;
}
更新-我已将entityManager.merge()更改为persist(),但仍然存在相同的问题


我还注意到,这台电视机不是。这可能是移动到openjpa时出现问题的原因吗?

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

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


你能发布eu.ist_.harmony.idb.database.hibernate.Domain.endpoints的注释吗?嗨,瑞克。我添加了端点的映射。您是否也可以发布Endpoint.domain?请尝试删除@MapKey,我不知道为什么会出现这种情况?项目使用hibernate时就是这样工作的。作为一个jpa注释,它的行为在jpa提供者之间应该是相同的吗?
@OneToMany(mappedBy = "domain", fetch = FetchType.LAZY, cascade = { javax.persistence.CascadeType.REMOVE })
@MapKey(name = "TNA")
public Set<Endpoint> getEndpoints() {
    return this.endpoints;
}