使用 jdbctemplate 插入行,主键由 @GeneratedValue 生成

Insert row using jdbctemplate with PrimaryKey generated by @GeneratedValue

我正在 Spring 引导应用程序中向 Oracle table 插入一行。需要使用注释生成主键。我有一个代表 table:

的实体模型
@Entity
@Table(name="PURCH_TENDR")
public class LhlPurchTendrModel implements Serializable {

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name="PURCH_TENDR_ID")
    private String purchTendrId;

    @Column(name="CREATED_BY_NM")
    private String createdByNm;

    @Column(name="CREATED_DT")
    private Timestamp createdDt;

    @Column(name="UPDATED_BY_NM")
    private String updatedByNm;

    @Column(name="UPDATED_DT")
    private Timestamp updatedDt;

    @Column(name="MODIFY_BY_NM")
    private String modifyByNm;

    @Column(name="MODIFY_DT")
    private Timestamp modifyDt;

    @Column(name="CARRIER_TENDER_ID")
    private long CarrierTenderId;

    @Column(name="EVENT_GMT_TM")
    private Timestamp EventGmtTm;

    @Column(name="PURCH_COST_ID")
    private int PurchCostId;

    @Column(name="LAT")
    private float Lat;

    @Column(name="LON")
    private float Lon;

    @Column(name="CITY_NM")
    private String cityNm;

    @Column(name="STATE_CD")
    private String stateCd;

    @Column(name="CARER_EDI_NBR")
    private String carerEdiNbr;

    @Column(name="EVENT_STAT_CD")
    private String eventStatCd;

    @Column(name="ETN_TM")
    private Timestamp EtnTm;

    @Column(name="PCKUP_NBR")
    private String PickupNbr;

    @Column(name="VIN")
    private String Vin;

    @Column(name="EQUIP_NBR")
    private String EquipNbr;

    @Column(name="EQUIP_PREFIX")
    private String EquipPrefix;

这些成员变量也有getter和setter。 我使用 Repository class 来实现 jdbctemplate 来插入行。 当我使用插入的这种变体时,出现列类型无效的错误:

public boolean insertPurchaseInfo(LhlPurchTendrModel lhlPurchTendrModel) throws SQLException {
        boolean success= false;
        String ds = lhlJdbcTemplate.getDataSource().getConnection().getSchema();
        LOGGER.info("Schema and Insert Purchase Info {}", ds);
        String insertSequenceNbrSQLStatement = "INSERT INTO purch_tendr(created_by_nm, created_dt, modify_by_nm, modify_dt, carrier_tender_id, purch_cost_id, event_stat_cd, equip_nbr, equip_prefix) " +
                "VALUES (?, SYSDATE, ?, SYSDATE, ?, ?, ?, ?, ?)";
        try{
            int rowsInserted = lhlJdbcTemplate.update(
                    insertSequenceNbrSQLStatement,                
                    new Object[] {lhlPurchTendrModel});

            if(rowsInserted > 0){
                success = true;
            }
        }

当我尝试使用此代码插入时,出现错误“无法将 NULL 插入 table Purch_Tendr 列 Purch_Tendr_Id。

public boolean insertPurchaseInfo(LhlPurchTendrModel lhlPurchTendrModel) throws SQLException {
        boolean success= false;
        String ds = lhlJdbcTemplate.getDataSource().getConnection().getSchema();
        LOGGER.info("Schema and Insert Purchase Info {}", ds);
        String insertSequenceNbrSQLStatement = "INSERT INTO purch_tendr(created_by_nm, created_dt, modify_by_nm, modify_dt, carrier_tender_id, purch_cost_id, event_stat_cd, equip_nbr, equip_prefix) " +
                "VALUES (?, SYSDATE, ?, SYSDATE, ?, ?, ?, ?, ?)";
        try{
            int rowsInserted = lhlJdbcTemplate.update(
                    insertSequenceNbrSQLStatement,                
                      new Object[]{lhlPurchTendrModel.getCreatedByNm(), lhlPurchTendrModel.getModifyByNm(), lhlPurchTendrModel.getCarrierTenderId(), lhlPurchTendrModel.getPurchCostId(),
                                lhlPurchTendrModel.getEventGmtTm(), lhlPurchTendrModel.getEquipNbr(), lhlPurchTendrModel.getEquipPrefix()});
            if(rowsInserted > 0){
                success = true;
            }
        }

我不确定如何将 @Entity class 与 JdbcTemplate 一起使用。如何指示JdbcTemplate生成主键值?

你不能,因为 @Entity 和你使用的所有注释如 @GeneratedValue@GenericGenerator 等来自 JPAJdbcTemplate 在幕后是仅基于 JDBC,它对 JPA 一无所知。

如果你想使用 JPA 来管理你的数据,你需要看的是选择一个 JPA 实现(例如 Hibernate 是一个流行的实现)并研究如何通过 JPA 接口使用它而不是看 JdbcTemplate.

一旦您掌握了使用 JPA 管理数据的基本思路,您可以考虑查看 spring 数据,这是一个构建在纯 JPA 之上的更高级别的工具,可以帮助实现存储库/DAO用于管理和查询数据的东西。