5

MessageとGeneratedMemberMessageの2つのエンティティがあります。ここでコードに示すよりも多くのフィールドがありますが、これらは私の質問のコンテキストに十分なものになるはずです。

私は単純な双方向のOneToMany関係を実行しようとしていますが、これまで読んだすべてのことから、これが実行される方法です。複合キーを使用していることに気付くでしょう。

次のエラーとスタックトレースが発生します。インターウェブの周りでこの問題を抱えている他の人を見たことがありますが、誰も私のために働く解決策を持っていません。誰かがここで問題を見ますか?

STが示唆しているように、私はWAS7.0でopenJPA1.2.2を使用しています。私はRAD7.5.4とEJB3.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;
}

スタックトレース

[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)
...
4

6 に答える 6

15

私は今日サンプルの問題に遭遇し、私のために働く解決策を見つけました。

にクラス名を追加しましたpersistence.xml。usingにMessageクラスを追加してみてください。persistence.xml<class>Message</class>

于 2011-06-21T04:00:59.327 に答える
2

JPA でこの HandlerFieldStrategy の問題が発生するのは、子エンティティ ABC [フィールドまたはコレクションの可能性がある] を持つエンティティ XYZ があり、子エンティティ、つまりこの場合は ABC が persistence.xml [META-INF/persistence] で宣言されていない場合です。 .xml]

于 2013-05-11T03:51:46.647 に答える
0

私は最近これに遭遇しました。Hibernate ツールを使用して JPA アノテーションを生成し、それらを Websphere 7 にデプロイすると、このエラーがスローされました。

ソリューション?その部分を取り除くだけmappedBy="XXX"です。

その後、すべてが読み込まれました。なぜそれが機能したのかはまだわかりません。

編集

この回答は無視してください - これにより、他の JPQL 問題が発生する可能性があります。投稿する前に、より徹底的なテストを行う必要があります。ごめん

于 2012-02-01T23:32:02.877 に答える
0

私は同じ問題を抱えていました。

メッセージが意味不明!

私の問題を解決したのは、エンティティ オブジェクトとそのpk オブジェクトequals()にandを実装することでした。hashCode()

それが誰かを助けることを願っています。

于 2014-06-24T15:48:21.973 に答える
0

MessagePK クラスを static にしたのはなぜですか? それはどういうわけか問題の一部ではありませんか?

于 2010-04-14T19:34:42.543 に答える