2010-03-17 104 views
3

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

我正在尝试做一个简单的双向OneToMany关系,并且从我读过的所有内容中,这是如何完成的。你会注意到我正在使用复合键。

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

正如ST建议的那样,我在WAS 7.0中使用了openJPA 1.2.2。我正在开发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; 
} 

堆栈跟踪

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

回答

0

为什么你让MessagePK类是静态的?这不是问题的一部分吗?

+1

因为你不能从外部实例化内部类(非静态嵌套类)(所以使用静态嵌套类是要走的路)。 – 2010-04-14 19:46:14

11

我今天遇到了示例问题,并找到了适合我的解决方案。

我将类名添加到persistence.xml。尝试使用<class>Message</class>Message类添加到persistence.xml

+0

这个解决方案为我工作。事实证明我只是忘了将新实体添加到persistence.xml中。错误消息是失望:) – anton1980 2014-02-26 20:40:51

0

我最近碰到这个。我使用hibernate工具生成JPA批注,并将它们部署到引发此错误的Websphere 7。

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

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

编辑

忽略这个答案 - 这可以创建其他JPQL问题。在发布之前,我应该做更彻底的测试。对不起

2

当你有一个实体XYZ有子实体ABC [可能是一个字段或一个集合],并且子实体,即我们的案例中的ABC没有在persistence.xml中声明时,你在JPA中得到这个HandlerFieldStrategy问题[ META-INF/persistence.xml]

0

我遇到了同样的问题。

消息不明确!

什么解决我的问题正在实施的实体对象equals()hashCode()及其PK对象

希望它可以帮助别人。

0

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