ConstraintViolationException не удалось выполнить оператор;SQL [н / п];ограничение [id] - PullRequest
0 голосов
/ 16 октября 2019

У меня есть две сущности, 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));

Любая помощь будет принята с благодарностью!

1 Ответ

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

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

Удалите урок: 1)Проверьте схему, которая генерируется в случае сомнений.

var con = dataSource.getConnection();

var databaseMetaData = con.getMetaData();

ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[]{"TABLE"});
System.out.println("Printing TABLE_TYPE \"TABLE\" ");
System.out.println("----------------------------------");
while(resultSet.next())
{
  //Print
  System.out.println(resultSet.getString("TABLE_NAME"));
}

ResultSet columns = databaseMetaData.getColumns(null,null, "study", null);
while(columns.next())
{
  String columnName = columns.getString("COLUMN_NAME");
  //Printing results
  System.out.println(columnName);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...