Заполните дочернюю таблицу первичным ключом из родительской таблицы

#java #mysql

Вопрос:

У меня есть customer стол и еще один address стол. Я пытаюсь автоматически вставить значение первичного ключа в address таблицу. Изначально у меня было все наоборот, и это сработало, однако отношения были неправильными, так как я не мог удалить cascade, когда клиент был удален. Информация вставляется в customer таблицу, но не сама address table . Это то, что у меня есть. Любое понимание будет оценено по достоинству.

  /**
 * Add a new customer.
 * @param customer The customer to be added.
 * @return customerId.
 * @throws SQLException If an error happens.
 */
public int addCustomer(Customer customer) throws SQLException {
    // first insert the address of the customer
    //int addressId = addAddress(customer.getAddress());

    // next insert the customer
    var sql = "INSERT INTO customer (customerId, customerName, active, createdBy)"  
            " VALUES (?, ?, ?, ?)";

    var statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    statement.setInt(1, 0);
    statement.setString(2, customer.getName());
    //statement.setInt(3, addressId);
    statement.setBoolean(3, customer.isActive());
    statement.setString(4, customer.getCreatedBy());

    statement.execute();
    var generatedKeys = statement.getGeneratedKeys();
    generatedKeys.next();
    return (int) generatedKeys.getLong(1);
}
/**
 * Add a new address to the database.
 * @param address The address to be added.
 * @throws SQLException if an error happens.
 */
public void addAddress(Address address) throws SQLException {
    
    int customerId = addCustomer(address.getCustomer());
    
    var sql = "INSERT INTO address (addressId, customerId, address, address2, cityId, countryId, postalCode, phone, createdBy) "  
            "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";

    var statement = connection.prepareStatement(sql);
    statement.setInt(1, 0);
    statement.setInt(2, customerId);
    statement.setString(3, address.getAddress());
    statement.setString(4, address.getAddress2());
    statement.setInt(5, address.getCity().getId());
    statement.setInt(6, address.getCountry().getId());
    statement.setString(7, address.getPostalCode());
    statement.setString(8, address.getPhone());
    statement.setString(9, address.getCreatedBy());

    statement.execute();
 

}

Комментарии:

1. В чем именно заключается проблема?

Ответ №1:

Получил некоторую помощь, просто обновив метод удаления клиента, чтобы он удалял связанный адрес вместе с клиентом.

 enter code here
    public void deleteCustomer(Customer customer) throws Exception {
    var appointments =
            appointmentRepository.findCustomerAppointments(customer.getId());

    if(!appointments.isEmpty()){
        throw new RuntimeException("Constraint Violation");
    }
    var deleteAddress = "DELETE FROM address WHERE addressId = ?";
    var statementDeleteAddress = connection.prepareStatement(deleteAddress);
    statementDeleteAddress.setInt(1, customer.getAddress().getId());
    statementDeleteAddress.execute();
    var sql = "DELETE FROM customer WHERE customerId = ?";
    var statement = connection.prepareStatement(sql);
    statement.setInt(1, customer.getId());
    statement.execute();