У меня есть две сущности, fileVersion и fileEnvironment , которые имеют отношение многие ко многим. Я использую соединительную таблицу, смоделированную fileDeployment сущностью.
Соединительная сущность:
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(
name = "file_deployment"
)
public class FileDeploymentEntity {
@EmbeddedId
private FileDeploymentKey id;
@ToString.Exclude
@ManyToOne
@MapsId("fileVersionId")
@JoinColumn(name = "fileVersionId")
private FileVersionEntity fileVersion;
@ToString.Exclude
@ManyToOne
@MapsId("fileEnvironmentId")
@JoinColumn(name = "fileEnvironmentId")
private FileEnvironmentEntity fileEnvironment;
}
Это составной ключ:
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder(toBuilder = true)
public class FileDeploymentKey implements Serializable {
@Column
private UUID fileVersionId;
@Column
private UUID fileEnvironmentId;
}
Репозиторий JPA:
@Repository
public interface FileDeploymentEntityRepository extends
JpaRepository<FileDeploymentEntity, FileDeploymentKey>,
JpaSpecificationExecutor<FileDeploymentEntity> {
}
Два объекта, для которых объект соединения захватывает отношение «многие ко многим» для:
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(
name = "file_environment"
)
public class FileEnvironmentEntity {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "uuid2")
private UUID id;
@ToString.Exclude
@OneToMany(mappedBy = "fileEnvironment")
private List<FileDeploymentEntity> fileDeployments;
}
FileVersion является другим
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(
name = "file_version"
)
public class FileVersionEntity {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "uuid2")
private UUID id;
@ToString.Exclude
@OneToMany(mappedBy = "fileVersion")
private List<FileDeploymentEntity> fileDeployments;
}
Следующий код выполняется нормально:
var fileDeploymentEntity = FileDeploymentEntity.builder()
.id(FileDeploymentKey.builder()
.fileVersionId(existingFileVersion.get().getId())
.fileEnvironmentId(existingFileEnvironment.get().getId())
.build())
.deploymentTime(
Instant.now(clock))
.fileEnvironment(existingFileEnvironment.get())
.fileVersion(existingFileVersion.get())
.build();
var result = fileDeploymentEntityRepository.save(fileDeploymentEntity);
Но когда в конце концов вызывается fileDeploymentEntityRepository.flush (), я получаю следующее исключение:
не может выполнить инструкцию;SQL [н / п];ограничение [id]
org.hibernate.exception.ConstraintViolationException: не удалось выполнить инструкцию
org.postgresql.util.PSQLException: ОШИБКА: нулевое значение в столбце «id» нарушает ограничение not-nullПодробно: строка с ошибками содержит (7670fec3-3766-4c69-9598-d4e89b5d1845, b9f6819e-af89-4270-a7b9-ccbd47f62c39, 2019-10-15 20: 29: 10.384987, ноль, ноль, ноль, ноль).
Если я также вызову save для двух сущностей, результат не изменится:
fileVersionEntityRepository
.save(existingFileVersion.get().addFileDeployment(fileDeploymentEntity));
fileEnvironmentEntityRepository
.save(existingFileEnvironment.get().addFileDeployment(fileDeploymentEntity));
Любая помощь будет принята с благодарностью!