JDBC Batch для пакетной вставки данных в postgres с учетом foreign key

Рейтинг: 0Ответов: 0Опубликовано: 21.02.2023

Я использую JDBC Batch для пакетной вставки данных в postgres в таблицу Product. Все работает корректно.

public void saveAllJdbcBatch(List<Product> productData){
        String sql = String.format(
                "INSERT INTO %s (title, stock, price, import_history_id) " +
                "VALUES (?, ?, ?, ?)", 
                Product.class.getAnnotation(Table.class).name()
        );
        try (Connection connection = hikariDataSource.getConnection();
             PreparedStatement statement = connection.prepareStatement(sql)
        ){
            int counter = 0;
            for (Product product : productData) {
                statement.clearParameters();
                statement.setString(1, product.getTitle());
                statement.setInt(2, product.getStock());
                statement.setFloat(3, product.getPrice());
                statement.setInt(4, product.getImportHistory().getId());
                statement.addBatch();
                if ((counter + 1) % batchSize == 0 || (counter + 1) == productData.size()) {
                    statement.executeBatch();
                    statement.clearBatch();
                }
                counter++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

В моей таблице Product появился в внешний ключ (item_id <-> id в таблице item) в соотношении one-to-one.

Как можно сохранять так же пакетно данные с учетом foreign ключа, чтобы они автоматически проставлялись при записи? поле для связи это id primaryKey в таблице item. и запись в эту таблицу (item) так же предполагается пакетно синхронно с существующей записью Product.

сущность 1.

@Entity
@Table(name = "Product", schema = "statement")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode
public class Product {

@Id
    @NonNull
    @GeneratedValue(strategy = SEQUENCE, generator = "seqGen")
    @SequenceGenerator(name = "seqGen", sequenceName = "seq")
    @Column(name = "id")
    private Long id;

    // разные поля

    @OneToOne(cascade = CascadeType.SAVE_UPDATE)
    @JoinColumn(name = "product_item_id", referencedColumnName = "id")
    private Item productItemId;
}

и вторя сущность

@Entity
@Table(name = "item", schema = "statement")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode
public class Item {

    @Id
    @NonNull
    @GeneratedValue(strategy = SEQUENCE, generator = "seqGen")
    @SequenceGenerator(name = "seqGen", sequenceName = "seq")
    @Column(name = "id")
    private Long id; 

    // другие поля

}

получается, если я скажем сначала вставлю в таблицу 100 записей item, а затем начну делать вставки записей для product, связи проставятся автоматически?

Ответы

Ответов пока нет.