首页 文章

为什么JPA在保存操作期间创建从另一个实体引用时已存在的新实体

提问于
浏览
2

我有以下2个由Spring Data管理的实体类(真的是幕后的JPA),并且出于某些原因,每当我尝试将新的Party保存到数据库中时,它都会添加一个新的重复的Organizer(即表中的重复条目与new ID) .

Organizer Class

@Entity
public  class Organizer implements Serializable {

    @Column(nullable=false)
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;


    @OneToMany(cascade={CascadeType.ALL},targetEntity=Party.class,mappedBy="id_Organizer")
    private Collection<Party> id_Party;
}

Party Class

@Entity
public  class Party implements Serializable {

    @Column(nullable=false)
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(cascade={CascadeType.ALL},targetEntity=Organizer.class)
    @JoinColumn(name="id_Organizer",referencedColumnName="id",nullable=false,updatable=false)
    private Organizer id_Organizer;
}

Save Method

@RequestMapping(value = "/createparty", method=RequestMethod.POST, produces = "application/json")
@ResponseBody
public List<Party> createParty(@RequestBody ArrayList<Map<String, Object>> models) {
    PartyRepository = context.getBean(PartyRepository.class);
    OrganizerRepository = context.getBean(OrganizerRepository.class);
    List<Party> PartyList = new ArrayList<>();

    for (Map<String, Object> model : models) {
        Organizer Organizer = OrganizerRepository.findByName((String) model.get("id_Organizer"));
        // Create new Organizer if find find returns nothing
        Party.setId_Organizer(Organizer);

        PartyList.add(Party);
    }
    // Check SpringDataTemplate on how to save
    PartyRepository.save(PartyList);
    return PartyList;
}

假设目前所有缔约方只能由组织者表中已列出的组织者创建,则Save方法中for循环中的行将尝试查找指定的组织者并设置从Party到此检索的组织者的引用 .

问题是这实际上使用新ID在Organizer表中保存了重复的Organizer条目 . 如果组织者已经存在,我们如何防止这种情况发生?

当我们想要允许某人使用尚未在Organizer表中使用的新管理器创建新的Party时,不存在针对未来情况的保存的级联 . 如果是这种情况,通过保存Party,它也应该保存一个新的Organizer .

1 回答

  • 0

    使用 merge 而不是 save . 你的实体不是持久的 .

相关问题