1

多対一の関連付けを使用して DB に JPA エンティティを挿入する際に問題があります。

私は使用しています:

  • スプリング ブート 2.1.4.RELEASE
  • Ecliselink 2.7.4.RC2 (org.eclipse.persistence.jpa)
  • spring-boot-starter-data-jpa

私はSpringのリポジトリを使用しています.saveメソッドしかなく、insert、merge、updateメソッドはありません。

DbWatchlist別のエンティティとの多対 1 の関連付けを持つエンティティを使用していますDbWatchlistProvider

塗りつぶされDBWatchlistたフィールドで新しいものを作成すると、すべて正常に機能します。DbWatchlistProviderまた、既存のフィールドを変更し、DbWatchlistここでもフィールドを変更DbWatchlistProviderして、すべてを保存すると機能します。

しかしDbWatchlist、既存のDbWatchlistProviderJPA で新しいレコードを作成しようとすると、常に新しいレコードを挿入しようとしDbWatchlistProviderます。

DbWatchlistProviderエンティティに挿入する前にデータベースからを読み込もうとしましたがDbWatchlist、その後保存を行いましたが、ここでも INSERT が行われました。これにより、例外が発生します。

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.4.v20190115-ad5b7c6b2a): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: unique constraint or index violation; SYS_PK_10144 table: WATCHLISTPROVIDER
Error Code: -104
Call: INSERT INTO WatchlistProvider (Key, Description, Id) VALUES (?, ?, ?)
bind => [3 parameters bound]

私のコード:

@Entity
@Table(name = TableName.WATCHLIST, uniqueConstraints = {
    @UniqueConstraint(columnNames = {ColumnName.PROVIDER_KEY, ColumnName.ID})})
@UuidGenerator(name = KEY_GENERATOR)
public class DbWatchlist {

  @Id
  @Column(name = ColumnName.KEY, nullable = false)
  @GeneratedValue(generator = KEY_GENERATOR)
  public String key;

  @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  @JoinColumn(name = ColumnName.PROVIDER_KEY, nullable = false, updatable = false)
  public DbWatchlistProvider watchlistProvider;

  @Column(name = ColumnName.ID, nullable = false)
  public String id;

  @Column(name = ColumnName.DESCRIPTION)
  public String description;

  @Column(name = ColumnName.LATEST_VERSION)
  public String latestVersion;
}

@Entity
@Table(name = TableName.PROVIDER, uniqueConstraints = {
    @UniqueConstraint(columnNames = {ColumnName.ID})})
@UuidGenerator(name = KEY_GENERATOR)
public class DbWatchlistProvider {

  @Id
  @Column(name = ColumnName.KEY, nullable = false)
  @GeneratedValue(generator = KEY_GENERATOR)
  public String key;

  @Column(name = ColumnName.ID, nullable = false)
  public String id;

  @Column(name = ColumnName.DESCRIPTION)
  public String description;
}

@Repository
public interface WatchlistRepository extends CrudRepository<DbWatchlist, String> {

  boolean existsByWatchlistProviderAndId(DbWatchlistProvider provider, String id);
}

私のテストでは、次のことを試しました。

DbWatchlistProvider provider = new DbWatchlistProvider();
provider.id = "PROV";
provider.description = "description for provider";

DbWatchlist newRow = new DbWatchlist();
newRow.id = "ID1";
newRow.description = "description";
newRow.watchlistProvider = provider;

DbWatchlist createdRow = repository.save(newRow);

createdRow.description = "update";
createdRow.watchlistProvider.description = "also updated";
createdRow = repository.save(createdRow);

DbWatchlist createdRow2 = new DbWatchlist();
createdRow2.watchlistProvider = createdRow.watchlistProvider;
createdRow2.id = "test";
createdRow2.description = "description";

//This save is not working, but the createdRow2.watchlistProvider.key is filled
repository.save(createdRow2);

最後の保存まで、すべてがエラーなしで機能しており、期待どおりです。DbWatchlistProvider何が問題なのか、なぜ挿入しようとしているのに更新されないのか、誰かに何か考えがありますか?

例外は次のとおりです。

Caused by: javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.4.v20190115-ad5b7c6b2a): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: unique constraint or index violation; SYS_PK_10144 table: WATCHLISTPROVIDER
Error Code: -104

Call: INSERT INTO WatchlistProvider (Key, Description, Id) VALUES (?, ?, ?)
bind => [3 parameters bound]

Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.4.v20190115-ad5b7c6b2a): org.eclipse.persistence.exceptions.DatabaseException

Query: InsertObjectQuery

Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: unique constraint or index violation; SYS_PK_10144 table: WATCHLISTPROVIDER

Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation; SYS_PK_10144 table: WATCHLISTPROVIDER
4

1 に答える 1