Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA。级联更新仅适用于特殊情况 最重要的结构描述:_Java_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java Spring数据JPA。级联更新仅适用于特殊情况 最重要的结构描述:

Java Spring数据JPA。级联更新仅适用于特殊情况 最重要的结构描述:,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,在我的应用程序中使用的是Spring数据JPA。 我的应用程序中有一个模型部件: @Entity public class Event implements Identifiable { // ... @OneToMany(cascade = CascadeType.ALL, mappedBy = "event", orphanRemoval = true) @OrderColumn(name = "order_index") private List<Attendee&g

在我的应用程序中使用的是Spring数据JPA。 我的应用程序中有一个模型部件:

@Entity
public class Event implements Identifiable {
  // ...
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "event", orphanRemoval = true)
  @OrderColumn(name = "order_index")
  private List<Attendee> attendees = new ArrayList<>();
  // ...
}

@Entity
public class Attendee implements Identifiable {
  // ...
  @ManyToOne
  @JoinColumn(columnDefinition = "event_id")
  private Event event;
  // ...
}
提供保存|更新事件,并用新的嵌套与会者替换所有旧的嵌套与会者

问题描述: 有时我需要在保存事件的同一事务中使用其他处理程序。他们还使用存储库:

// transaction starts... some handlers are used
eventRepository.save(event);
// some additional handlers2 are used
// transaction ends
如果
handlers2
包含任何具有独立实体的存储库操作,例如:

profileRepository.findAll();
// or
profileRepository.findByEmail("anyEmail");
,它失败,出现异常
org.hibernate.transientObject异常:对象引用未保存的临时实例-在刷新之前保存临时实例:com.nextiva.calendar.entity.Attendee
。与会者集合似乎应该保存,因为它不是

为了解决这个问题,我使用了如下解决方法:

// transaction starts... some handlers are used
attendeeRepository.save(event.getAttendees());
eventRepository.save(event);
// some additional handlers2 are used
// transaction ends
现在可以了,但我不喜欢这种方式

问题:
  • 这是我的架构问题吗
  • 这是冬眠问题吗
  • 在没有冗余调用AttendeRepository.save(event.getAttendees())的情况下如何配置它

  • 尝试切换到JpaRepository并使用

    eventRepository.saveAndFlush(event);
    
    而不是
    eventRepository.save(event)

    它将强制repo刷新数据库中所有挂起的更改



    此外,还应检查您是否在回购界面上设置了
    @Transactional(readOnly=true)
    ,以使
    保存方法的刷新模式变为从不(如中所述,或如手册所述)。也许这就是问题所在…

    没有尝试使用
    eventRepository.saveAndFlush(event)
    (来自JpaRepository)?不,我没有这样做是因为spring jpa存储库,例如:
    org.springframework.data.repository.paging和sortingrepository
    org.springframework.data.jpa.repository.JpaRepository
    不提供
    saveAndFlush
    防止替换分页和排序存储的内容‌​从ry到JpaRepository?会有什么帮助?
    eventRepository.saveAndFlush(event);
    
    eventRepository.save(event);
    eventRepository.flush();