4

データを 2 つのテーブル (エンティティと関連テーブル) に保存する必要があります。save()エンティティ リポジトリのメソッドを使用してエンティティを保存するだけです。次に、パフォーマンスのために、ネイティブ sqlの関連付けテーブルに行を挿入する必要があります。行には、以前に保存したエンティティへの参照があります。ここで問題が発生します。外部キーに関する整合性制約の例外が発生します。最初に保存されたエンティティは、この 2 番目のクエリでは不明です。

これが私のコードです:

レポ:

public interface DistributionRepository extends JpaRepository<Distribution, Long>, QueryDslPredicateExecutor<Distribution> {

    @Modifying
    @Query(value = "INSERT INTO DISTRIBUTION_PERIMETER(DISTRIBUTION_ID, SERVICE_ID) SELECT :distId, p.id FROM PERIMETER p "
        + "WHERE p.id in (:serviceIds) AND p.discriminator = 'SRV' ", nativeQuery = true)
    void insertDistributionPerimeter(@Param(value = "distId") Long distributionId, @Param(value = "serviceIds") Set<Long> servicesIds);
}

サービス :

@Service
public class DistributionServiceImpl implements IDistributionService {

    @Inject
    private DistributionRepository distributionRepository;

    @Override
    @Transactional
    public DistributionResource distribute(final DistributionResource distribution) {

        // 1. Entity creation and saving
        Distribution created = new Distribution();
        final Date distributionDate = new Date();
        created.setStatus(EnumDistributionStatus.distributing);
        created.setDistributionDate(distributionDate);
        created.setDistributor(agentRepository.findOne(distribution.getDistributor().getMatricule()));
        created.setDocument(documentRepository.findOne(distribution.getDocument().getTechId()));
        created.setEntity(entityRepository.findOne(distribution.getEntity().getTechId()));
        created = distributionRepository.save(created);

        // 2. Association table 
        final Set<Long> serviceIds = new HashSet<Long>();
        for (final ServiceResource sr : distribution.getServices()) {
            serviceIds.add(sr.getTechId());
        }

        // EXCEPTION HERE
        distributionRepository.insertDistributionPerimeter(created.getId(), serviceIds);
    }
}

@Transactionnalアノテーションを設定しているのに対し、2 つのクエリは異なるトランザクションにあるようです。また、 を使用して 2 番目のクエリを実行しようとしたentityManager.createNativeQuery()ところ、同じ結果が得られました...

4

1 に答える 1