1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

EJB, hibernate salvando sozinho

Eu tenho uma estrutura no projeto assim:

Controller -> Service -> Repository

O Controller tem regra de tela. O Service tem regra de negocio. E o repository tem regra de banco.

Basicamente seria apenas para o repository fazer o CRUD. Porém no meu service quando eu seto um atributo em algum objeto (qualquer um que esteja mapeado) ele atualiza na hora no banco de dados, sem chamar nenhum metodo de salvar (do repository no caso).

Alguem ja passo por isso?

tentei rancar o auto commit do persistence (dxa false) mais nao adiantou

@RequestScoped @ApplicationScoped
public class HomeController { 

    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");
        }
    }


}

E no meu service eu tenho:

@Stateless(name = "BannerService")
@Remote(IBannerService.class)
public class BannerService implements IBannerService {

    @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() + " -opa"); //quando eu do um set no objeto, ele ja atualiza no banco de dados... coisa de louco isso!!!... o correto seria eu chamar o metodo salvar =S...
        }
        return bannersLink;
    }

        @Override
    public void salvar(Banner banner) {
        this.bannerRepository.update(banner); //até aqui beleza, se eu mando atualizar ele atualiza o banner
    }
}

No meu repository tenho:

@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);
    }

}
  • Como ta seu arquivo persistence.xml? Posta para darmos uma olhada.

    AndersonLira   15 de abr de 2014
  • Eu acho que quando você faz a busca com metodo this.bannerRepository.buscarBanners, aquele objeto recupado fica em estado gerenciado, assim caso você altere algum dado, automaticamente é atualizado no banco. Bem estou supondo ...

    Fabiomindua   19 de abr de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags ejb hibernate ou faça a sua própria pergunta.