0

次のようなカリキュラムエンティティがあります。

@Entity
public class Curriculum {

    @ManyToMany
    private Set<Language> languages;
    ...

Curriculum インスタンスを永続化しようとしていますが、制約は Language インスタンスが既にデータベースにあることです。

curriculum永続化の呼び出しが行われたときに、行がテーブル、curriculum_languagesマッピング テーブルに挿入されますが、テーブルは既に入力されている参照テーブルであるため、テーブルには挿入されないことを確認するにはどうすればよいですlanguage?

編集1

Cascade.ALL-属性を指定しないと発生するエラーは次のとおりです。

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.bignibou.domain.Language

- を指定するとCascade.ALL、新しい ID を持つ新しい行がlanguageテーブルに挿入されますが、これは明らかに私が望んでいるものではありません...

編集 2 : インスタンスを永続化するために Spring Data JPA を使用し、ブラウザーからのデータは次のように JSON オブジェクトであることに注意してください。

{"curriculum":{"languages":[{"id":46,"description":"Français"},{"id":30,"description":"Chinois"}],"firstName":"Julianito","dateOfBirth":"1975-01-06","telephoneNumber":"0608965874","workExperienceInYears":3,"maxNumberChildren":1,"drivingLicense":true}}
4

3 に答える 3

0

これを実現する最も簡単な方法は、必要な言語を DB からロードし、永続化操作の直前にカリキュラムに割り当てることです。

この背後にあるロジックは次のとおりです。

  • 言語オブジェクトがアプリケーションに取り込まれ、JSON からデシリアライズされると、ID フィールドが既に割り当てられています。
  • カリキュラムを (JSON から逆シリアル化された言語で) 永続化しようとすると、JPA はこれらの ID について混乱します。一方では、これらのオブジェクト (ID が設定されている) について知っている必要がありますが、他方では、アクティブな JPA セッションはそうではありません。それらについて何でも知っている(JSONの外の世界から来た)
  • したがって、ID で言語を取得すると、JPA は誰が誰であるかがわかります。
于 2013-10-28T11:43:13.010 に答える