JDBC Batch для пакетной вставки данных в postgres с учетом foreign key
Я использую 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, связи проставятся автоматически?
Источник: Stack Overflow на русском