2017-07-07 107 views
0

我有两个关系ManyToMany类,我想创建观众,然后将它们添加到事件,但它抛出“分离”异常。休眠ManyToMany保存

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}) 

所以您首先创建观众,然后创建事件,然后将观众列表附加到事件并将事件对象保存到数据库中。

+0

你的意思是,如果我会评论“audienceRepository.save(观众)”,然后保存“事件”会保存我的观众?我忽略了“audienceRepository.save(观众)”,它看起来像事件没有保存它,因为当我“查找所有”观众时,什么都没有。 – Evgenii

+0

你是通过事件对象找到观众还是直接找到观众? –

+1

您还必须在保存活动之前为观众设置活动。因为它的双向关系 –

0

您也可以使用这样的“PrePersist” UTIL法“链接”事件和观众的变体:

@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

exampletests

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活动。

现在我可以这样创建对象:

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

,并将其添加到我的事件是这样的:

Event eventFirst = new Event(); 
eventFirst.getAudiences().add(audiences.get(0)); 
eventRepository.save(eventFirst);