Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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 JPARepository未保存到数据库_Java_Spring_Jpa_Jdbc - Fatal编程技术网

Java JPARepository未保存到数据库

Java JPARepository未保存到数据库,java,spring,jpa,jdbc,Java,Spring,Jpa,Jdbc,说来话长,但这个周末我不得不重新设计一个应用程序。从spring启动应用程序到spring批处理应用程序。这个过程始终是一个批处理过程,但我试图使这个批处理引擎变得太复杂,我不得不停止我正在做的事情。我相信我们都去过那里。不管怎样,一切都很好!!除了一段我试图保留原始代码的代码。我正在尝试使用JPARepository保存方法,但它不起作用!!我可以调用save方法,我觉得Repo是实例化的,因为我没有得到null指针异常。事实上,我不会抛出任何异常。我只是在数据库里什么都没看到。我知道这段代码

说来话长,但这个周末我不得不重新设计一个应用程序。从spring启动应用程序到spring批处理应用程序。这个过程始终是一个批处理过程,但我试图使这个批处理引擎变得太复杂,我不得不停止我正在做的事情。我相信我们都去过那里。不管怎样,一切都很好!!除了一段我试图保留原始代码的代码。我正在尝试使用JPARepository保存方法,但它不起作用!!我可以调用save方法,我觉得Repo是实例化的,因为我没有得到null指针异常。事实上,我不会抛出任何异常。我只是在数据库里什么都没看到。我知道这段代码是有效的,因为我在以前的设计中运行过它。不管怎样,这是我的课程

数据对象:

@Data
@Entity
@Table(name="PAYEE_QUAL_LS")
public class PayeeList {

    @EmbeddedId
    private PayeeListPK payeeListPK = new PayeeListPK();
    @Column(name = "PAYEE_QUAL_CD")
    private String payeeQualCode;
    @Column(name = "ETL_TS")
    private Timestamp etlTimestamp;
}
主键数据类

@Data
@Embeddable
public class PayeeListPK implements Serializable {

    @Column(name = "PAYEE_NM")
    private String payeeName;
    @Column(name = "BAT_PROC_DT")
    private Date batchProcDate;
}
回购类

@Repository
public interface PayeeListRepo extends JpaRepository<PayeeList,String> {}
我有一个Tasklet的实现,我正在从批处理步骤调用它

public class PayeeListTableLoad implements Tasklet {
    private static final Logger logger = LoggerFactory.getLogger(PayeeListTableLoad.class);

    private java.sql.Date procDt;
    private String inputFile;
    private Timestamp time;
    private int safeRecordCount = 0;
    private int blockRecordCount = 0;
    private int safeRejectRecordCount = 0;
    private int blockRejectRecordCount = 0;
    private ArrayList<String> rejectRecordList = new ArrayList<>();

    @Autowired
    OracleService oracleService;

    @Override
    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        java.util.Date parsed = format.parse(System.getenv("procDt"));
        procDt = new java.sql.Date(parsed.getTime());
        inputFile = Constants.filePath;
        time = new Timestamp(System.currentTimeMillis());

        logger.info("Running data quality checks on input file and loading to Oracle");

        try (BufferedReader reader = new BufferedReader(new FileReader(inputFile))) {
            String line = reader.readLine();
            while (line != null) {
                if (dataQuality(line)) {
                    PayeeList payeeList = buildPayeeListObject(line);
                    oracleService.loadToPayeeListTable(payeeList);
                    logger.info("Record loaded: " + line);
                } else {
                    rejectRecordList.add(line);
                    try {
                        if (line.split("\\|")[1].equals("B")) {
                            blockRejectRecordCount++;
                        } else if (line.split("\\|")[1].equals("S")) {
                            safeRejectRecordCount++;
                        }
                        logger.info("Record rejected: " + line);
                    } catch (ArrayIndexOutOfBoundsException e) {
                        e.printStackTrace();
                    }
                }
                line = reader.readLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        logger.info("Safe record count is: " + safeRecordCount);
        logger.info("Block record count is: " + blockRecordCount);
        logger.info("Rejected records are: " + rejectRecordList);

        SendEmail sendEmail = new SendEmail();
        sendEmail.sendEmail(Constants.aegisCheckInclearingRecipient,Constants.aegisCheckInclearingSender,Constants.payeeListFileSuccessEmailSubject,Constants.payeeListFileSuccessEmailBodyBuilder(safeRecordCount,blockRecordCount,safeRejectRecordCount,blockRejectRecordCount,rejectRecordList));

        logger.info("Successfully loaded to Oracle and sent out Email to stakeholders");

        return null;
    }
最终,我们的步骤是运行Tasklet的实现,我们自动连接OracleService类,然后调用它,然后调用Repo方法。我正在使用Oracle服务类方法,并且正在调用自动连线存储库的save方法,但是仍然没有发生任何事情

编辑

我找到了另一种方法,那就是使用EntityManager并使用persist和flush方法。下面是我的Oracle服务类中的LoadToPayeListTable方法

public class OracleService {
    private static final Logger logger = LoggerFactory.getLogger(OracleService.class);

    @Autowired
    PayeeListRepo payeeListRepo;

    public void loadToPayeeListTable(PayeeList payeeList) {
        payeeListRepo.save(payeeList);
    }
    public void loadToPayeeListTable(PayeeList payeeList) throws ParseException {
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        entityManager.persist(payeeList);
        entityManager.flush();
        transaction.commit();
        entityManager.close();
    }

您可以尝试使用Spring测试通过存储库吗?我从未遇到过这个问题,但我不确定DB类型。是Mysql吗,Oracle?因为我从未将它与@EmbeddedId一起使用过。
如果您通过了单元测试,您应该通过调试检查您的服务逻辑。相反,您应该首先通过测试。

将您的jpa存储库更改为

@Repository
public interface PayeeListRepo extends JpaRepository<PayeeList, PayeeListPK>
@存储库
公共接口PayeListrepo扩展了JpaRepository

logger.info(“记录已加载:+行”)-正在打印吗?@ScaryWombat是的,正在打印!通常我会问你看的是不是正确的DB@ScaryWombat对于使用JdbcBatchItemWriter的其他作业,批处理中还有其他步骤,并且编写得很好。这一切都是通过一个在OracleConfiguration类中配置的数据源进行设置的为什么是tasklet而不是reader/processor/writer?看来你还没有完全融入春运。也就是说,您的服务看起来不是事务性的,没有事务就没有保存。但是,每次保存1个事务无法执行,因此您需要x大小的块(x您需要自行确定)。因此,您最好使用支持所有这些开箱即用的读写器。添加注释没有帮助。@M.Deinum注释与现有代码一起使用。接口上的注释没有任何作用,在这种情况下,它甚至不添加任何内容,因为Spring数据有一种不同的检测存储库的方法。FWIW这是神谕
@Repository
public interface PayeeListRepo extends JpaRepository<PayeeList, PayeeListPK>