我需要将数据保存到两个表中(一个实体和一个关联表)。
我只是用以下命令保存我的实体save()
我的实体存储库中的方法。
然后,为了性能,我需要将行插入到关联表中原生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()
并得到相同的结果......
Invoke entityManager.flush()
在执行本机查询或使用之前saveAndFlush
反而。
根据您的具体情况,我建议使用
created = distributionRepository.saveAndFlush(created);
重要提示:您的“本机”查询必须使用相同的事务! (或者您现在需要事务隔离级别)
你还写道:
我真的不明白为什么默认情况下不执行刷新操作
刷新由 Hibernate 处理(可以配置,默认为“auto”)。这意味着休眠会在任何时间点刷新数据。但始终在您通过 Hibernate 提交事务或执行其他 SQL 语句之前。 - 所以通常这没有问题,但在你的情况下,你用本机查询绕过hibernate,所以hibernate不会知道这个语句,因此它不会刷新它的数据。
另请参阅我的这个回答:https://stackoverflow.com/a/17889017/280244 https://stackoverflow.com/a/17889017/280244关于这个话题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)