Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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 为什么JPA要创建一个在保存操作中从另一个实体引用时已经存在的新实体_Java_Spring Mvc_Jpa_Spring Data - Fatal编程技术网

Java 为什么JPA要创建一个在保存操作中从另一个实体引用时已经存在的新实体

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)

我有以下两个实体类由SpringData(实际上是幕后的JPA)管理,出于某些原因,每当我尝试将一个新的参与方保存到数据库中时,它都会添加一个新的重复管理器(即表中具有新id的重复条目)

组织者类

@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
中删除级联。在该关系的两端都设置了级联,因此可能会导致循环错误。