当前位置: 首页 > 知识库问答 >
问题:

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

马沛
2023-03-14

我有以下两个实体类由Spring Data管理(实际上是幕后的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;
}

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

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

当我们希望允许某人使用尚未在Organizer表中的新Organizer创建一个新的聚会时,不会出现“保存以备将来使用”的级联。如果是这种情况,那么通过保存聚会,也应该保存一个新的组织者。

共有1个答案

温翔宇
2023-03-14

使用“合并”而不是“保存”。您的实体不是持久的。

 类似资料:
  • Thread[hz._hzinstance_1_dev.partition-operation.thread-3,5,_hzinstance_1_dev]无法进行远程调用:com.hazelcast.collection.impl.collection.operations.CollectionAddOperation{serviceName='hz:impl:setService',identi

  • 我已经完成了一些Java教程,它们都说在调用类时创建一个新变量。这是为什么?我已经测试了一些代码,但它没有这样做。我已经使用python很长一段时间了,所以我习惯于使用动态语言。 请看下面我一直在玩的一些代码: 谢谢你的时间。

  • 问题内容: 我的JPA / Hibernate应用程序中有几个映射的对象。在网络上,我收到的数据包代表这些对象的更新,或者实际上可能完全代表新的对象。 我想写一个像 如果数据库中存在一个带有pk primaryKey的对象,则该对象将返回所提供类的一个对象,否则将创建该类的新对象,并将其持久化并返回。 接下来,我将使用该对象来更新事务中的所有字段。 在JPA中是否有惯用的方法来执行此操作,还是有更

  • 我有一个jpa实体,比如entityA和另一个实体,比如entityB,它们之间没有任何映射/关联。我想在更新或保存EntityA时对entityB执行一些JPQL或操作。例如,假设我保存了新的entityA,所以我想在entityB上运行一些自定义JPQL查询,或者由于新保存了entityA而从DB中删除entityB。我想使用EntityListener,但我不知道如何使用,因为我在myh自定

  • 我的Person表中有字段country(FK,可以为空)。当我试图用空的国家/地区值保存Person时,我将收到一条错误消息500和消息 2020-01-30 15:16:37.277警告10524---[nio-8098-exec-1]o.h.发动机。jdbc。spi。SqlExceptionHelper:SQL错误:0,SQLState:23502 2020-01-30 15:16:37.2