5

我有两个实体:Message 和 GeneratedMemberMessage。这里的字段比我在代码中显示的要多,但是这些应该为我的问题提供足够的上下文。

我正在尝试做一个简单的双向 OneToMany 关系,从我读过的所有内容来看,这就是它的完成方式。您会注意到我正在使用复合键。

我收到以下错误和堆栈跟踪。我见过其他人在互联网上遇到过这个问题,但没有人有适合我的解决方案。有人在这里看到问题吗?

正如 ST 建议的那样,我在 WAS 7.0 中使用 openJPA 1.2.2。我正在使用 RAD 7.5.4 和 EJB 3.0 进行开发。

消息.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. 尝试将Message类添加到persistence.xmlusing <class>Message</class>

于 2011-06-21T04:00:59.327 回答
2

当您有一个具有子实体 ABC [可能是字段或集合]的实体 XYZ 并且在我们的案例中未在 persistence.xml [META-INF/persistence .xml]

于 2013-05-11T03:51:46.647 回答
0

为什么将 MessagePK 类设为静态?这难道不是问题的一部分吗?

于 2010-04-14T19:34:42.543 回答
0

我最近遇到了这个。我使用休眠工具生成 JPA 注释并将它们部署到引发此错误的 Websphere 7。

解决方案?只需删除该mappedBy="XXX"部分。

之后加载所有内容。我仍然不知道它为什么起作用。

编辑

忽略这个答案 - 这可能会产生其他 JPQL 问题。我应该在发布之前进行更彻底的测试。对不起

于 2012-02-01T23:32:02.877 回答
0

我遇到了同样的问题。

消息不清楚!

解决我的问题的是在实体对象及其pk 对象中实现equals()和。hashCode()

希望它可以帮助某人。

于 2014-06-24T15:48:21.973 回答
0

我有同样的问题,但在我的情况下,我混合 mappedBy = "foo" 了 foo 必须声明该字段的地方!不是专栏。

于 2016-09-13T13:59:13.937 回答