Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Activiti服务任务中立即将实体持久化/提交到数据库_Java_Spring Boot_Spring Data Jpa_Spring Transactions_Activiti - Fatal编程技术网

Java 如何在Activiti服务任务中立即将实体持久化/提交到数据库

Java 如何在Activiti服务任务中立即将实体持久化/提交到数据库,java,spring-boot,spring-data-jpa,spring-transactions,activiti,Java,Spring Boot,Spring Data Jpa,Spring Transactions,Activiti,我需要在调用save(或saveAndFlush)代码时立即将实体持久化(插入)到数据库中 但是,尽管实体是在上下文中创建的,但它不会立即持久化到数据库中 我们使用的是弹簧靴 public interface MessageRepository extends JpaRepository<MessageEntity, Long> { } 虽然实体已创建,但它不会立即持久化/提交到数据库 我们仅在Activiti任务中面临此问题 任何反馈都将不胜感激 克服这种情况的一种方法是利用RE

我需要在调用save(或saveAndFlush)代码时立即将实体持久化(插入)到数据库中

但是,尽管实体是在上下文中创建的,但它不会立即持久化到数据库中

我们使用的是弹簧靴

public interface MessageRepository extends JpaRepository<MessageEntity, Long> {
}
虽然实体已创建,但它不会立即持久化/提交到数据库

我们仅在Activiti任务中面临此问题


任何反馈都将不胜感激

克服这种情况的一种方法是利用REQUIRES_NEW transaction属性

在您的情况下,您必须创建一个新的存储库:

public interface MessageRepositoryCustom{
   void saveAndFLush(MessageEntity ent);
}


public MessageRepositoryCustomImpl implements MessageRepositoryCustom{

   @Autowired
   private SessionFactory sessionFactory;

   @Transactional(propagation = Propagation.REQUIRES_NEW)
   void saveAndFLush(MessageEntity ent){
       Session session = sessionFactory.getCurrentSession();

       session.persist(ent);
   }
}
@Transactional
        public MessageEntity saveMessage(MessageEntity entity) throws Exception {
            entity = messageRepositoryCutom.saveAndFlush(entity);

            // other processing

            return entity;
        }
}
然后,在您的服务中,您将使用该存储库:

public interface MessageRepositoryCustom{
   void saveAndFLush(MessageEntity ent);
}


public MessageRepositoryCustomImpl implements MessageRepositoryCustom{

   @Autowired
   private SessionFactory sessionFactory;

   @Transactional(propagation = Propagation.REQUIRES_NEW)
   void saveAndFLush(MessageEntity ent){
       Session session = sessionFactory.getCurrentSession();

       session.persist(ent);
   }
}
@Transactional
        public MessageEntity saveMessage(MessageEntity entity) throws Exception {
            entity = messageRepositoryCutom.saveAndFlush(entity);

            // other processing

            return entity;
        }
}
现在,在
messageRepositoryCutom.saveAndFlush
方法完成处理后,实体将在数据库中进行物理持久化,因为它是在已提交的单独事务中创建的。

这起到了作用

@Component
public class MessageRepositoryCustomImpl implements MessageRepositoryCustom {

    @PersistenceContext
    EntityManager entityManager;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public MessageEntity saveImmediate(MessageEntity entity) {
        entityManager.persist(entity);
        return entity;
    }
}

非常感谢。快速澄清。如何定义会话。会话。持续(ent);我们最终使用EntityManager而不是SessionFactory。这样做有任何缺点。整个愤怒看起来更标准<代码>@Component公共类MessageRepositoryCustomImpl实现MessageRepositoryCustom{@PersistenceContext EntityManager EntityManager;@Override@Transactional(propagation=propagation.REQUIRES_NEW)public MessageEntity saveImmediate(MessageEntity实体){EntityManager.persist(entity);return entity;}不错的选择。EntityManager始终是首选方式,因为它是JPA标准。这个解决方案真的对你有用吗?是的。谢谢,太好了。很高兴我能帮忙