【发布时间】:2015-07-01 17:56:27
【问题描述】:
我需要将数据保存到 2 个表(一个实体和一个关联表)中。
我只是使用我的实体存储库中的save() 方法保存我的实体。
然后,为了表演,我需要将行插入到 native sql 中的关联表中。这些行对我之前保存的实体有参考。
问题来了:我得到一个关于外键的完整性约束异常。在第二个查询中不知道第一个保存的实体。
这是我的代码:
回购:
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 注释。我还尝试使用entityManager.createNativeQuery() 执行我的第二个查询并得到相同的结果...
【问题讨论】:
-
在
save()之后尝试flushing -
如果将 save() 替换为 saveAndFlush() 会怎样?
-
也可以在相关插入到辅助表中定义一个触发器。
-
谢谢大家,
saveAndFlush()完美运行!
标签: java sql spring spring-data native-sql