Проблема с двунаправлением ManyToOne - PullRequest
4 голосов
/ 17 марта 2010

У меня есть две сущности: Message и GeneratedMemberMessage. Здесь больше полей, чем я покажу в коде, но их должно быть достаточно для контекста моего вопроса.

Я пытаюсь сделать простые двунаправленные отношения OneToMany, и из всего, что я прочитал, это то, как это должно быть сделано. Вы заметите, что я использую составные ключи.

Я получаю следующую ошибку и трассировку стека. Я видел других людей, у которых была эта проблема в сети, но ни у кого нет решения, которое бы работало на меня. Кто-нибудь видит здесь проблему?

Как предполагает ST, я использую openJPA 1.2.2 в WAS 7.0. Я работаю с RAD 7.5.4 и EJB 3.0.

Message.java

@Entity
@Table(schema="dbo", name="Messages")
public class Message implements Serializable {

  @Embeddable
  public static class MessagePK implements Serializable {
    @Column(name="SourceApplication")
    String sourceApplication;

    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="MessageId")
    BigDecimal messageId;

    //Getters and setters here

  }


  @EmbeddedId
  MessagePK pk = new MessagePK();
  ...

  @OneToMany(cascade={CascadeType.ALL}, mappedBy="message")
  List<GeneratedMemberMessage> generatedMemberMessages = new ArrayList<GeneratedMemberMessage>();

  ...

}

GeneratedMemberMessage.java

@Entity
@Table(schema="dbo", name="GeneratedMemberMessages")
public class GeneratedMemberMessage implements Serializable {
  @Embeddable
  public static class GMMPK implements Serializable {

    @Column(name="SourceApplication")
    String sourceApplication;

    @Column(name="MessageId")
    int messageId;

    @Column(name="MessageGenerationDateTime")
    Date messageGenerationDateTime;

    //Getters and setters here

  }
  ...

  @ManyToOne(optional = true)
  @JoinColumns({  
    @JoinColumn(name="sourceApplication", referencedColumnName="SourceApplication"),  
    @JoinColumn(name="messageId", referencedColumnName="MessageId")
  }) 
  Message message;

  ...

}

Мой метод EJB

public Message newMessage(String sourceApplication, String text, int priority, String type){
    Message m = new Message(sourceApplication);
    m.setMessageText(text);
    m.setMessagePriority(priority);
    m.setMessageType(type);
    m.setSysLstUpdtUserId("me");    
    em.persist(m);
    return m;
}

StackTrace

[3/17/10 14:55:05:457 EDT] 0000001e SystemErr     R javax.ejb.EJBException: See nested exception; nested exception is: <openjpa-1.2.2-SNAPSHOT-r422266:778978M-OPENJPA-975 fatal user error> org.apache.openjpa.persistence.ArgumentException: Field "com.bcbst.bamp.jpa.Message.generatedMemberMessages" cannot declare that it is mapped by another field. Its mapping strategy (org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy) does not support mapping by another field.
[3/17/10 14:55:05:457 EDT] 0000001e SystemErr     R Caused by: <openjpa-1.2.2-SNAPSHOT-r422266:778978M-OPENJPA-975 fatal user error> org.apache.openjpa.persistence.ArgumentException: Field "com.bcbst.bamp.jpa.Message.generatedMemberMessages" cannot declare that it is mapped by another field. Its mapping strategy (org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy) does not support mapping by another field.
[3/17/10 14:55:05:457 EDT] 0000001e SystemErr     R     at org.apache.openjpa.jdbc.meta.strats.AbstractFieldStrategy.assertNotMappedBy(AbstractFieldStrategy.java:59)
[3/17/10 14:55:05:457 EDT] 0000001e SystemErr     R     at org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy.map(HandlerFieldStrategy.java:71)
[3/17/10 14:55:05:457 EDT] 0000001e SystemErr     R     at org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:121)
[3/17/10 14:55:05:457 EDT] 0000001e SystemErr     R     at org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(RuntimeStrategyInstaller.java:80)
[3/17/10 14:55:05:457 EDT] 0000001e SystemErr     R     at org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:454)
[3/17/10 14:55:05:457 EDT] 0000001e SystemErr     R     at org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:419)
[3/17/10 14:55:05:457 EDT] 0000001e SystemErr     R     at org.apache.openjpa.jdbc.meta.ClassMapping.resolveNonRelationMappings(ClassMapping.java:879)
[3/17/10 14:55:05:457 EDT] 0000001e SystemErr     R     at org.apache.openjpa.jdbc.meta.MappingRepository.prepareMapping(MappingRepository.java:339)
...

Ответы [ 6 ]

12 голосов
/ 21 июня 2011

Сегодня я столкнулся с примером проблемы и нашел решение, которое помогло мне.

Я добавил имя класса к persistence.xml. Попробуйте добавить класс Message к persistence.xml, используя <class>Message</class>.

2 голосов
/ 11 мая 2013

Эта проблема HandlerFieldStrategy возникает в JPA, когда у вас есть Entity XYZ, у которого есть дочерний объект ABC [может быть полем или коллекцией], а дочерний объект, т. Е. ABC, в нашем случае не объявлен в файле persistence.xml [META- INF / persistence.xml]

0 голосов
/ 13 сентября 2016

У меня была такая же проблема, но в моем случае я перепутал mappedBy = "foo" где foo должен объявить поле! Не столбец.

0 голосов
/ 24 июня 2014

У меня была такая же проблема.

Сообщение не ясно!

Что решило мою проблему реализовал equals() и hashCode() в объекте и его pk объекте .

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 02 февраля 2012

Я недавно столкнулся с этим. Я сгенерировал аннотации JPA с помощью инструментов гибернации и развернул их в Websphere 7, которая вызвала эту ошибку.

Решение? Просто удалите часть mappedBy="XXX".

Все загружено после этого. Я до сих пор не знаю, почему это сработало.

Редактировать

Игнорировать этот ответ - это может создать другие проблемы с JPQL. Я должен сделать более тщательное тестирование перед публикацией. К сожалению

0 голосов
/ 14 апреля 2010

Почему вы сделали класс MessagePK статическим? Разве это не является частью проблемы?

...