переход от спящего режима к openjpa: ошибки при разрешении метаданных

Я работаю над проектом, в котором используется спящий режим, и моя работа заключается в том, чтобы переключить его на 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

Ошибка вызывается EntityManager.merge(), который ранее был SessionManager.saverOrUpdate(). Я знаю, что эти методы работают немного по-разному, но из-за ошибки это не проблема, а что-то до этого.

Я не сильно трогал сущности при переходе от спящего режима к 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;
}

update- я изменил entityManager.merge() для persist(), но у меня все еще есть те же проблемы

Я также заметил, что набор не . могло ли это вызвать проблему при переходе на openjpa?


person santiagozky    schedule 28.03.2012    source источник
comment
Можете ли вы опубликовать аннотации для eu.ist_phosphate.harmony.idb.database.hibernate.Domain.endpoints?   -  person Rick    schedule 28.03.2012
comment
привет Рик. Я добавил отображение для конечных точек.   -  person santiagozky    schedule 28.03.2012
comment
Можете ли вы также опубликовать Endpoint.domain?   -  person Rick    schedule 28.03.2012
comment
Попробуйте удалить @MapKey, я не уверен, почему это там?   -  person Rick    schedule 28.03.2012
comment
это работало так, когда проект использовал спящий режим. Будучи аннотацией jpa, должно ли ее поведение быть одинаковым для всех поставщиков jpa?   -  person santiagozky    schedule 28.03.2012
comment
кстати. это работает. не могли бы вы указать это как ответ, чтобы я мог выбрать его?   -  person santiagozky    schedule 28.03.2012


Ответы (1)


Попробуйте удалить @MapKey. Я думаю, что неправильно использовать его в этом контексте.

Аннотация @MapKey используется для указания ключа карты для ассоциаций типа java.util.Map, когда ключ карты сам по себе является первичным ключом или постоянным полем или свойством объекта, который является значением карты.

person Rick    schedule 28.03.2012