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

Spring jpa尝试插入多个时间相同的行

曹普松
2023-03-14

所以我有下面这样的课程,试图实现多人关系

        @Entity(name="request_city_id")
        @Table(uniqueConstraints={@UniqueConstraints{columnNames={"request_id","cityId"})})
        @Data
        @NoArgsConstructor
        @FieldDefault(level=AccessLevel.PRIVATE)
        public class RequestCityId{
    
                @GenratedValue(strategy=SEQUENCE, generator="seq_req_city_id")
                @SequenceGenerator(name="seq_req_city_id", allocationSize=1)
                @Column(name="rc_id") 
                @Id
                long id;
                //some other many to one joins
                @ManyToOne
                @JoinColumn(name="request_id")
                Request request;
                String cityId;
                String status;
                RequestCityId(Request req){
                   request= req;}
        }

现有表:

        @Entity(name="request")
        @Data
        @NoArgsConstructor
        @FieldDefault(level=AccessLevel.PRIVATE)
        public class Request{
            String frequency
            @GenratedValue(strategy=SEQUENCE, generator="seq_req_d")
            @SequenceGenerator(name="seq_req_id", allocationSize=1)
            @Column(name="request_id") 
            @Id
            long id;

            @OneToMany(cascade={ PERSIST, MERGE}, mappedBy="request", fetch=EAGER)
            Set<RequestCityId> requestCityIds;
 
    }

以下是serviceClass:

RequestRepository reqRepo; // this class extends crudRespository
public RequestDto merge(RequestDto request){
    Request req= mapper.requestDtoToRequest(request);
    Request enhancedObject = enhanceReq( req);
    Request savedObject = reqRepo.save(enahncedObject);
    return mapper.requestToRequestDto(savedObject)
}

private Request enhanceReq(Request req){
    Set<RequestCityId> requestCityIds= req.getRequestCityIds();
    requestCityIds.foreach(e-> e.setRequest(req));
    return req;
}

但是当我运行我的代码时,它试图多次插入,因为我遇到了约束冲突,我应该怎么做才能解决这个问题?

共有1个答案

郁和通
2023-03-14

这是因为您正在将普通的非托管POJO附加到requestCityID,然后尝试持久化(插入),因为这些是托管实体,这意味着您不必显式调用save来实际更新实体。

为了避免这种情况,首先使用

Request savedObject=reqRepo。保存(enahncedObject)

然后在您的方法中使用该savedObject-它现在是一个托管代理

private Request enhanceReq(Request saved){
    Set<RequestCityId> requestCityIds= req.getRequestCityIds();
    requestCityIds.foreach(e-> e.setRequest(saved));
    return req;
}

那么应该可以了。很明显,您必须在调用顺序等方面周旋,但是多个插入的主要问题将会消失。

 类似资料:
  • 我正在开发一个spring批处理应用程序(内存为2GB),尝试处理数据(在处理过程中使用select查询获取数据),并在postgres DB中插入大约100万条处理过的记录。我在这个项目中使用Spring Data JPA。但是Spring JPA在处理这些记录时消耗了太多内存

  • 问题内容: 我有一个类似于以下内容的插入语句: 我需要使用多个ID插入同一条语句。现在我有: 我只是必须运行此程序,还是有一个更精简的版本? 问题答案: 使用:

  • 问题内容: 我有一个列的表,让我们把它称为是目前该表中的所有行。我想将所有行的值插入该列。有人可以给我这个SQL吗? 我已经尝试过了,但这仅填充了最后一行。如何一次完成所有行? 问题答案: 您正在寻找UPDATE not insert。 UPDATE将更改现有行的值(并且可以包含WHERE以使其仅影响特定行),而INSERT将添加新行(这使其看起来仅更改了最后一行,但实际上是添加了新行)具有该值的

  • 问题内容: 我正在尝试使用Linq / EntityFramework将数据从C#应用程序保存到数据库中。插入到一个表很简单,但是我不确定如何将数据插入到三个都与自动增量标识互连的表中?这是一个小问题,所以我使用一个线程及其所有帖子- 每个 ThreadTitle 和每个 Post 都与一个 User (不是实际的表名)相关联。 我的设计思想是将完整线程刮入内存,然后进行“批量”插入。为了减少负载

  • 问题内容: 我有这种形式的字符串 字符串中的所有%s都具有相同的值(即s)。有没有更好的方式编写此代码?(而不是列出三遍) 问题答案: 您可以使用Python 2.6和Python 3.x中提供的高级字符串格式:

  • 问题内容: 遵循Android标签的任何人都可能对我很熟悉。我很难为我的高分实现SQLite数据库。这也是我第一次使用SQLite。 我正在尝试仅插入两个变量-int和long。我的方法无法正常工作。除了上面讨论的内容外,任何其他建议也应受到赞赏。 预先感谢您的帮助。 Highscores.java DatabaseHelper.java LogCat输出 问题答案: 在这行上,打开数据库: 这会