2017-07-07 6 views
0

関係数がManyToManyの2つのクラスがありますが、作成するオーディエンスを作成して後でイベントに追加したいが、 "detached"例外が発生する。Hibernate ManyToMany save

class Event { 
    @ManyToMany(
      fetch = FetchType.LAZY, 
      targetEntity = Audience.class, 
      cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinTable(name = "UC_EVENT_AUDIENCE", 
      joinColumns = @JoinColumn(name = "event_id"), 
      inverseJoinColumns = @JoinColumn(name = "audience_id"))  
    private List<Audience> targetAudiences = new ArrayList<>(); 
} 

clsas Audience { 
    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "targetAudiences") 
    private List<Event> events = new ArrayList<>(); 
} 

public void run(ApplicationArguments args) throws Exception { 
    //Generate audience data 
    List<Audience> audiences = dataGenerator.createAudiences(); 
    //Save to db 
    audienceRepository.save(audiences); 

    Event event = new Event(); 
    event.setTargetAudiences(audiences);  
    eventRepository.save(events); 
} 

答えて

0

あなたが最初のが、あなたのコード内で定義された関係で保存観客をやっている:

イベントは、観客の永続化を処理するため、これまで:だから

@ManyToMany(
      fetch = FetchType.LAZY, 
      targetEntity = Audience.class, 
      cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 

オーディエンスを作成してからイベントを作成し、オーディエンスリストをイベントに添付して、イベントオブジェクトを最後にデータベースに保存します。

@Entity 
public class Event { 

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    private final Set<Audience> audiences = new HashSet<>(); 

    @PrePersist 
    public void addAudiences() { 
     audiences.forEach(audience -> audience.getEvents().add(this)); 
    } 
} 

@Entity 
public class Audience { 

    @ManyToMany(mappedBy = "audiences") 
    private final Set<Event> events = new HashSet<>(); 

    //... 
    public Set<Event> getEvents() { 
     return events; 
    } 
} 

もっと多対多の関連性についての情報と「ユーティリティメソッド」:Hibernate User Guide

マイexampleあなたは「リンク」のイベントや観客にこの「PrePersist」utilのメソッドのように使用することができます。変形例として

+0

はあなたが意味する「audienceRepository.save(観客を)」と:

audienceRepository.save(new Audience("Name")); 

をそして、このように私のイベントに追加:

今、私はこのような聴衆を作成することができます「イベント」を保存すると、オーディエンスが節約されますか?私は "audienceRepository.save(観客)"を無視し、イベントを保存しないように見えます。なぜなら、私が "findAll"観客に何もないからです。 – Evgenii

+0

あなたはイベントオブジェクトを通じてオーディエンスを見つけるか、直接オーディエンスを探していますか? –

+1

イベントを保存する前に、視聴者のためにイベントを設定する必要もあります。その双方向関係 –

0

私はこれを実行し、それは私のための仕事です:

public class Event { 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "event_audience", 
      joinColumns = @JoinColumn(name = "event_id"), 
      inverseJoinColumns = @JoinColumn(name = "audience_id"), 
      uniqueConstraints = @UniqueConstraint(columnNames = {"event_id", "audience_id"})) 
    private List<Audience> audiences = new ArrayList<>(); 
} 

public class Audience { 

    @Column(name = "audience_name", nullable = false, unique = true) 
    private String name; 
} 

また、私は観客と春のJpaRepositoryを拡張イベントを保存するための2つのリポジトリを持っています。その後、私はコメントするかどう

Event eventFirst = new Event(); 
eventFirst.getAudiences().add(audiences.get(0)); 
eventRepository.save(eventFirst); 
関連する問題