首页 > 解决方案 > Spring Boot,如何在具有 EmbeddedId 的表中插入新记录

问题描述

我是新手,Spring-boot但有点熟悉JPA。我有一个正在处理的项目,我已经database设置好并从我的数据库生成了我的模型。我参与了至少 4JPA个项目,这是我第一次遇到@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() {
}
...
}

如果没有@EmbeddedIdinJPA我会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.乘客, CONSTRAINTfk_passenger_user1 FOREIGN KEY (user_uuid ) REFERENCESuser (uuid) ON DELETE NO ACTION ON UPDATE NO ACTION) 有人可以帮我理解这个吗?

标签: javaspringspring-bootjpaspring-data-jpa

解决方案


事实证明,我的user表存储引擎myISAMinnoDB我的其他表不同。我将其更改为innoDB并且我的代码有效。


推荐阅读