Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 EJB、Hibernate、object.setProperty在服务中时自动保存_Java_Hibernate_Ejb_Autocommit - Fatal编程技术网

Java EJB、Hibernate、object.setProperty在服务中时自动保存

Java EJB、Hibernate、object.setProperty在服务中时自动保存,java,hibernate,ejb,autocommit,Java,Hibernate,Ejb,Autocommit,在我的项目中,我有这样的体系结构: 控制器->服务->存储库->数据库(oracle) 控制器->查看规则 服务->业务规则 存储库->数据库规则 当我更改服务中对象的de属性时,我的项目将自动执行更新。这是错误的,因为我必须调用我的存储库来保存 我举一个例子: @RequestScoped @ApplicationScoped public class HomeController { //this is my controller private List<Banner>

在我的项目中,我有这样的体系结构:

控制器->服务->存储库->数据库(oracle)

  • 控制器->查看规则
  • 服务->业务规则
  • 存储库->数据库规则
  • 当我更改服务中对象的de属性时,我的项目将自动执行更新。这是错误的,因为我必须调用我的存储库来保存

    我举一个例子:

    @RequestScoped @ApplicationScoped
    public class HomeController { //this is my controller
    
        private List<Banner> banners;
    
            @EJB
        private IBannerService bannerService;
    
            @PostConstruct
        public void init() {
            try {
                this.banners = this.bannerService.buscarBanners(TipoBanner.HOME);
            } catch (Exception e) {
                e.printStackTrace();
                loggerApp(ModuloTipo.PORTAL, LogTipo.ERROR, getNomeUsuarioLogado(), PortalAcaoLog.INIT_ERRO, "erro ao abrir home");
            }
        }
    
    
    }
    

    JPA EntityManager的默认行为是在其参与的任何事务结束时刷新和提交—无论是普通的PersistenceContext(您的案例)还是扩展的

    此外,EJB的默认行为是在所有公共方法上都是事务性的(需要传播),这意味着如果不存在事务,它将创建事务

    您的属性更改每次都会提交,因为您的BannerService(它是EJB)上每次都有一个事务


    我建议在BannerService上用@TransactionAttribute(TransactionAttributeType.SUPPORTS)注释buscarBanners()方法

    非常感谢您。这解决了我的问题。我将进一步研究@TransactionAttribute
    @Stateless(name = "BannerService")
    @Remote(IBannerService.class)
    public class BannerService implements IBannerService { //this is my service
    
        @EJB
        private IBannerRepository bannerRepository;
    
        @Override
        public List<Banner> buscarBanners(TipoBanner tipo) {
                  List<Banner> bannersLink = this.bannerRepository.buscarBanners(tipo);
    
            for(Banner b : bannersLink) {
                System.out.println(b.getDescricao());
                b.setDescricao(b.getDescricao() + " - this is a test"); //when i do this, automatically save my object 0.o... i don`t now what is happening.
            }
            return bannersLink;
        }
    
            @Override
        public void salvar(Banner banner) {
            this.bannerRepository.update(banner); //when i want to save, i call this method
        }
    }
    
    @Stateless(name = "BannerRepository")
    @Local(IBannerRepository.class)
    public class BannerRepository implements IBannerRepository {
    
            @PersistenceContext
        private EntityManager entityManager;
    
           @Override
        public void update(Object object) {
            this.entityManager.merge(object);
        }
    }