我有以下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 回答
使用
merge
而不是save
. 你的实体不是持久的 .