Spring boot, как вставить новую запись в таблицу с EmbeddedId - PullRequest
0 голосов
/ 21 октября 2019

Я новичок в Spring-boot, но немного знаком с JPA. У меня есть проект, над которым я работаю, я уже настроил database и сгенерировал мои модели из моей базы данных. Я работал как минимум над 4 JPA проектами, и я впервые столкнулся с @EmbeddedId.

У меня есть таблица Passenger, которая выглядит как

public class Passenger implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected PassengerPK passengerPK;
@Size(max = 13)
@JoinColumn(name = "user_uuid", referencedColumnName = "uuid", insertable = false, updatable = false)
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private User user;
@Column(name = "date_created")
@Temporal(TemporalType.TIMESTAMP)
private Date dateCreated;
....
}

И мой сгенерированный passengerPK

@Embeddable
public class PassengerPK implements Serializable {
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(name = "uuid")
private String uuid;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(name = "user_uuid")
private String userUuid;

public PassengerPK() {
}
...
}

Без @EmbeddedId в JPA я бы добавил новую запись в таблицу Passenger сначала initializing и сохранил бы пользователя

final User user = new User();
user.setUuid(UUID.randomUUID().toString());
user.setFname(passengerDto.getFirstName());
user.setLname(passengerDto.getLastName());
user.setPassword(passwordEncoder.encode(passengerDto.getPassword()));
user.setEmail(passengerDto.getEmail());
user.setPhone(passengerDto.getPhone());
user.setDateCreated(new Date());

User savedUser = userRepository.save(user);

Затем я передаю этого пользователя моему новому Passenger, например

  final Passenger passenger = new Passenger();
  passenger.setUuid(UUID.randomUUID().toString());
  passenger.setUser(savedUser);
  passenger.setDateCreated(new Date());
  Passenger savedPassenger = passengerRepository.save(passenger);

But this fails, I get an error that `user_uuid` is null

. Затем я изменяю что-то вроде

final Passenger passenger = new Passenger();
PassengerPK passengerPK = new PassengerPK();
passengerPK.setUuid(UUID.randomUUID().toString());
passengerPK.setUserUuid(savedUser.getUuid());
passenger.setPassengerPK(passengerPK);
passenger.setDateCreated(new Date());
Passenger savedPassenger = passengerRepository.save(passenger);

, и я получаю сообщение об ошибке java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails ( mydatabase * 1031. * passenger , CONSTRAINT fk_passenger_user1 FOREIGN KEY ( user_uuid ) REFERENCES user ( uuid ) ON DELETE NO ACTION ON UPDATE NO ACTION) Может кто-нибудь помочь мне понять это?

1 Ответ

0 голосов
/ 22 октября 2019

Оказывается, мой user механизм хранения таблиц был myISAM вместо innoDB, как и остальные мои таблицы. Я изменил его на innoDB, и мой код сработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...