У меня есть две сущности: 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)
...