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

回购协议。save()将单个实体Springboot保存两次

明宜年
2023-03-14

当我试图用Springboot在数据库中保存一个实体时,出现了一种奇怪的行为。

@Autowired
private OrderRepository orderRepository;

@Autowired
private final KafkaTemplate<String, OrderDto> kafkaTemplate;

public void createOrders(String sapOrder) throws ParseException {

    List<Order> ordersFromSap = KafkaUtils.extractOrdersFromText(sapOrder);

    try {
        for (Order orderFromSap : ordersFromSap) {
            //DB
            orderRepository.save(orderFromSap);
        }
    } catch (Exception e) {
        log.info("Error:" + e.getMessage());
    }
}

使用调试器,我检查了我的ordersFromSap列表仅包含一个订单。除了设置为NULLid属性之外,此订单已完全实例化。

数据库为空,位于orderRepository之后。保存(来自SAP的订单) 命令我在表格中找到了两行。

控制台在执行该行后立即打印:

Hibernate: 
    insert 
    into
        orders
        (dimension, end_date, po_number, quantity, sap_code, sap_code_description, start_date, status) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        orders
        (dimension, end_date, po_number, quantity, sap_code, sap_code_description, start_date, status) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)

所以我认为是与保存命令相关的东西,而不是像我的方法被执行两次这样的东西。

这是订单类:

package com.dotnext.kafka.model;

import lombok.*;

import java.lang.reflect.Field;
import java.util.*;
import javax.persistence.*;
import javax.validation.constraints.*;

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table( name = "orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotBlank
    private String poNumber;
    @NotBlank
    private String dimension;
    @NotBlank
    private String sapCode;
    @NotBlank
    private String sapCodeDescription;
    @NotBlank
    private int quantity;
    @NotBlank
    private Date startDate;
    @NotBlank
    private Date endDate;
    @Enumerated(EnumType.STRING)
    @Column(length = 20)
    private PoStatus status;

    public List<String> getProperties() {
        List<String> outList = new ArrayList<String>();
        for (Field f : getClass().getDeclaredFields()) {
            outList.add(f.getName());
        }
        return outList;
    }
}

这是我的应用程序的jpa部分。yml

jpa:
   defer-datasource-initialization: 'true'
   hibernate:
     ddl-auto: create-drop
   properties:
     hibernate:
       data: classpath:Data.sql
       dialect: org.hibernate.dialect.MySQL5InnoDBDialect
       format_sql: true
   show-sql: true

共有1个答案

艾奕
2023-03-14

尝试在createOrders方法上使用事务性注释,它将在不使用的情况下保存记录。保存方法。

 类似资料:
  • 我创建了一个可扩展的演示osgi,用于嵌入osgi以加载动态规则。我只能找到一个旧的日食春分3.8。maven central上的0 jar提供了一个NullPointerException,但代码在ApacheFelix上运行良好。是否有一个与sbt/ivy/maven合作的回购协议,该协议有更新的Equininox版本,以便我可以试用? 编辑:请注意上面链接中的演示是为了嵌入eclipse E

  • 在Nexus3(OSS 3.13.0-01)中,我创建了一个组“public”,其中包含(除其他外)代理存储库maven central(https://repo1.maven.org/maven2/)还有大西洋(https://maven.atlassian.com/repository/public/).这两个存储库都包含工件com。国际商用机器公司mobilefirstplatform。cl

  • 假设我有一个spring bean我想在整个应用程序中使用,但是因为它是遗留代码,所以我不能在或任何类型的bean中使用它,因为这个类是在整个项目中手动实例化的,所以我不能在我想要的地方自动地使用它。 我如何为一个我想要重用的spring bean创建一个包装器类,配置如下,这样它除了返回在应用程序上下文中注册的bean的实例之外什么都不做? 基本上,我正在寻找类似的方法,如: 这样,在我想使用M

  • 我已经试着解决这件事很长一段时间了,但我什么也没得到。我一直在试图保存一个实体,该实体拥有对另一个实体的引用。 用户通过填写表单创建一个place实体,然后按save保存该实体。它应该自动在“places”和“place\u url”表中创建新行。下面是我正在加载到应用程序中的SQL文件的链接:https://pastebin.com/x8Gvk7ub 母实体: 子实体: 控制器: Hiberna

  • 问题内容: 我在Web应用程序中使用了JPA,但我想不出如何持久化彼此相关的两个新实体。这里是一个例子: 这是两个实体 该 消费者 有一个 ID 和其他一些价值观。该 ProfilePicture 使用 消费者 的 ID ,因为它是自己的主键和外键。(由于没有使用者,ProfilePicture将不存在,并且并非每个使用者都具有ProfilePicture) 我使用NetBeans生成实体类和会话

  • 目前,我们所有的构建都失败了,因为无法从公共SBT插件回购中解析插件。我们得到以下错误: [警告]注意:某些未解析的依赖项具有额外属性。检查这些依赖项是否与请求的属性一起存在。[警告]com。类型安全。播放:sbt插件:2.4。0(scalaVersion=2.10,sbtVersion=0.13)[警告]com。github。gseitz:sbt版本:1.0。0(标度规避=2.10,sbtVer