3

こんにちは、みんな、

レガシーデータベースからすべての jpa エンティティを構築しようとしています。繰り返し発生する問題があります。一部の「メイン」エンティティには「翻訳」のコレクションがあり、主キーは「メイン」のキー + 「言語」識別子です。言語は、処理を容易にするためにデータベースと Enum に格納されます。

使用している JPA 実装は Hibernate 4 です。

以下、現在の実装:

メイン: (メッセージ)

@Entity
@Table(name="MESSAGES")
@NamedQueries({
public class Message implements Serializable {

  @Id
  @SequenceGenerator(name="MESSAGES_MESSAGEID_GENERATOR", sequenceName="SEQ_MSG_messageID")
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="MESSAGES_MESSAGEID_GENERATOR")
  @Column(name="messageId")
  private long id;

  @OneToMany(mappedBy="message", fetch=FetchType.EAGER)
  private Set<MessageDesc> descriptions;
}

翻訳: (MessageDesc)

@Entity
@Table(name="MESSAGEDESCS")
public class MessageDesc implements Serializable, Translatable {

  @EmbeddedId
  private MessageDescPK id;

  @NotNull  
  @Enumerated(EnumType.ORDINAL)
  @Column(name = "LANGUAGEID")
  private LanguageEnum language;

  @NotNull  
  @ManyToOne
  @JoinColumn(name="MESSAGEID")
  private Message message;
}

翻訳複合キー: (MessageDescPK)

@Embeddable
public class MessageDescPK implements Serializable {

  @Column(name="messageid", nullable = false, insertable = false)
  private long message;

  @Column(name="languageid", nullable = false, insertable = false)
  private int language;
}

言語: (LanguageEnum)

public enum LanguageEnum {
  FRENCH(0, "FR"),
  DUTCH(1, "NL");

  private int id;
  private String desc;
}

問題は、説明にいくつかの翻訳があり、言語とメッセージが設定されている翻訳を含むメイン (メッセージ) エンティティを永続化しようとすると、次の例外が発生し続けることです。

org.springframework.orm.jpa.JpaSystemException: org.hibernate.id.IdentifierGenerationException: null id generated for:class something.persistence.entity.message.MessageDesc; nested exception is javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: null id generated for:class something.persistence.entity.message.MessageDesc
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:321)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:403)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:111)

messageDesc インスタンスに言語とメッセージ (既に保持されている) の両方を設定した後、PK が null になる理由がわかりません。ヘルプ、コメント、手がかりをいただければ幸いです。

ありがとう!

4

1 に答える 1