Java 为什么JPA要创建一个在保存操作中从另一个实体引用时已经存在的新实体
我有以下两个实体类由SpringData(实际上是幕后的JPA)管理,出于某些原因,每当我尝试将一个新的参与方保存到数据库中时,它都会添加一个新的重复管理器(即表中具有新id的重复条目) 组织者类Java 为什么JPA要创建一个在保存操作中从另一个实体引用时已经存在的新实体,java,spring-mvc,jpa,spring-data,Java,Spring Mvc,Jpa,Spring Data,我有以下两个实体类由SpringData(实际上是幕后的JPA)管理,出于某些原因,每当我尝试将一个新的参与方保存到数据库中时,它都会添加一个新的重复管理器(即表中具有新id的重复条目) 组织者类 @Entity public class Organizer implements Serializable { @Column(nullable=false) @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@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;
}
@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;
}
保存方法
@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;
}
@RequestMapping(value=“/createparty”,method=RequestMethod.POST,products=“application/json”)
@应答器
公共列表createParty(@RequestBody ArrayList models){
PartyRepository=context.getBean(PartyRepository.class);
OrganizerRepository=context.getBean(OrganizerRepository.class);
List PartyList=new ArrayList();
用于(地图模型:模型){
Organizer Organizer=OrganizerRepository.findByName((字符串)model.get(“id_Organizer”);
//如果“查找”不返回任何内容,则创建新的管理器
第三方会议组织者(组织者);
PartyList.add(Party);
}
//检查SpringDataTemplate,了解如何保存
PartyRepository.save(PartyList);
返回PartyList;
}
假设目前所有参与方只能由Organizer表中已列出的组织者创建,则Save方法中for循环中的行将尝试查找指定的组织者,并将参与方的引用设置为此检索到的组织者
问题是,这实际上使用新id在Organizer表中保存了重复的Organizer条目。如果Organizer已经存在,我们如何防止这种情况发生
当我们希望允许某人使用尚未在Organizer表中的新Organizer创建新的聚会时,在save for future cases上没有级联。如果是这种情况,通过保存聚会,它也应该保存一个新的组织者。使用
merge
而不是save
。您的实体不是持久的。我不确定,但我相信这是因为您在@JoinColumn
注释中的私人组织者id\u Organizer
中有updateable=false
。试着移除它,看看它是否能像预期的那样工作。此外,您还应验证您正在检索的组织者
是否已在参与方
中找到并正确设置。此外,如果不大写变量名,代码的可读性会更高。以小写字母开头是一种很好的做法。谢谢。刚把它拆了,但还是不起作用。事实上,我得到了一个循环json错误,但有以下例外。请求处理失败;嵌套异常是org.springframework.http.converter.HttpMessageNotWritableException:无法编写JSON:Infinite recursion(StackOverflowerr)不太关心JSON循环错误,因为我认为我可以通过使用以下注释类来解决JSON循环错误@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,property=“id”)是否要从组织者处更新参与方?如果没有,我将从Organizer
中的id\u Party
中删除级联。在该关系的两端都设置了级联,因此可能会导致循环错误。