2017-05-15 65 views
0

我正在开发一个应用程序使用Vaadin和我有一些麻烦: 当我尝试保存和Hibernate对象,除非我双重保存它。从我的类休眠不保存实体,只有当我双保存

代码:

if (referenciacao==null){ 
    referenciacao = (Referenciacao)referenciacaoSession.newEntity(); 
} 
referenciacao.setMedico((Medico)cbbMedico.getValue()); 
referenciacao.setOrigem((Origem)cbbOrigem.getValue()); 
referenciacao.setReferenciacaotipo((ReferenciacaoTipo)cbbReferenciacaoTipo.getValue()); 
referenciacao=referenciacaoSession.saveAndFlush(referenciacao); 

Referenciacao实体:

import java.io.Serializable; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

/** 
* 
* @author pepatusco 
*/ 
@SuppressWarnings("serial") 
@Entity 
@Table(name = "referenciacao") 
public class Referenciacao extends BaseBean implements Serializable { 

    public static final String PROPERTY_ID = "id"; 
    public static final String PROPERTY_MEDICO = "medico"; 
    public static final String PROPERTY_ORIGEM = "origem"; 
    public static final String PROPERTY_REFTIPO = "referenciacaoTipo"; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "medico_id") 
    private Medico medico; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "origem_id") 
    private Origem origem; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "referenciacao_tipo_id") 
    private ReferenciacaoTipo referenciacaoTipo; 

    public Medico getMedico() { 
     return medico; 
    } 

    public void setMedico(Medico medico) { 
     this.medico = medico; 
    } 

    public Origem getOrigem() { 
     return origem; 
    } 

    public void setOrigem(Origem origem) { 
     this.origem = origem; 
    } 

    public ReferenciacaoTipo getReferenciacaotipo() { 
     return referenciacaoTipo; 
    } 

    public void setReferenciacaotipo(ReferenciacaoTipo referenciacaoTipo) { 
     this.referenciacaoTipo = referenciacaoTipo; 
    } 


    public Referenciacao() { 
     //this.id = null; 
    } 

} 

Referenciacao DAO:

import java.util.List; 
import javax.transaction.Transactional; 
import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.stereotype.Repository; 
import pt.app.dpn.base.common.beans.entity.Medico; 
import pt.app.dpn.base.common.beans.entity.Origem; 
import pt.app.dpn.base.common.beans.entity.Referenciacao; 
import pt.app.dpn.base.common.beans.entity.ReferenciacaoTipo; 

/** 
* 
* @author pepatusco 
*/ 
@Repository 
@Transactional 
public interface ReferenciacaoRepository extends JpaRepository<Referenciacao, Long> { 

    List<Referenciacao> findByMedico(Medico medico); 
    List<Referenciacao> findByOrigem(Origem origem); 
    List<Referenciacao> findByReferenciacaoTipo(ReferenciacaoTipo referenciacaoTipo); 
    Referenciacao findByMedicoAndOrigemAndReferenciacaoTipo(Medico medico, Origem origem, ReferenciacaoTipo referenciacaoTipo); 
    Referenciacao findById(Long id); 

} 

ReferenciacaoSession

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import javax.ejb.Local; 
import javax.ejb.Stateless; 
import javax.enterprise.inject.Default; 
import javax.inject.Inject; 
import javax.transaction.Transactional; 
import pt.app.dpn.base.common.beans.dao.ReferenciacaoRepository; 
import pt.app.dpn.base.common.beans.entity.BaseBean; 
import pt.app.dpn.base.common.beans.entity.Medico; 
import pt.app.dpn.base.common.beans.entity.Origem; 
import pt.app.dpn.base.common.beans.entity.Referenciacao; 
import pt.app.dpn.base.common.beans.entity.ReferenciacaoTipo; 

/** 
* 
* @author pepatusco 
* 
*/ 
@Default 
@Stateless 
@Local(ReferenciacaoSessionLocal.class) 
public class ReferenciacaoSession implements ReferenciacaoSessionLocal, Serializable { 

    @Inject 
    private ReferenciacaoRepository referenciacaoRepository; 

    @Override 
    public void flush() { 
     referenciacaoRepository.flush(); 
    } 
    @Transactional 
    @Override 
    public <S extends Referenciacao> S saveAndFlush(S s) { 
     return referenciacaoRepository.saveAndFlush(s); 
    } 


    @Override 
    public Long getCount() { 
     return referenciacaoRepository.count(); 
    } 

    @Override 
    public List<BaseBean> findAll() { 
     List<BaseBean> listBaseBean = new ArrayList<>(); 
     referenciacaoRepository.findAll().forEach((referenciacao) -> { 
      listBaseBean.add(referenciacao); 
     }); 
     return listBaseBean; 
    } 

    @Transactional 
    @Override 
    public void save(Object o) { 
     referenciacaoRepository.save((Referenciacao)o); 
     referenciacaoRepository.flush(); 
    } 

    @Override 
    public void remove(Object o) { 
     referenciacaoRepository.delete((Referenciacao)o); 
    } 

    @Override 
    public Object newEntity() { 
     return new Referenciacao(); 
    } 

    @Override 
    public List<Referenciacao> findByMedico(Medico medico) { 
     return referenciacaoRepository.findByMedico(medico); 
    } 

    @Override 
    public List<Referenciacao> findByOrigem(Origem origem) { 
     return referenciacaoRepository.findByOrigem(origem); 
    } 

    @Override 
    public Referenciacao findById(Long id) { 
     return referenciacaoRepository.findById(id); 
    } 

    @Override 
    public List<Referenciacao> findByReferenciacaoTipo(ReferenciacaoTipo referenciacaoTipo) { 
     return referenciacaoRepository.findByReferenciacaoTipo(referenciacaoTipo); 
    } 

    @Override 
    public Referenciacao findByMedicoAndOrigemAndReferenciacaoTipo(Medico medico, Origem origem, ReferenciacaoTipo referenciacaoTipo) { 
     return referenciacaoRepository.findByMedicoAndOrigemAndReferenciacaoTipo(medico, origem, referenciacaoTipo); 
    } 

} 

有谁能告诉我为什么,当我做保存时,表中什么也没有出现,但是当我再次保存时,它在表中保存了Referenciacao

回答

0

我看不到这种行为的原因,所以让我至少尝试帮助调试这件事情。

我了解可能会在多个可能的事情:

  1. 对你的实体存储库不会被调用的第一次尝试,你给我们的代码以外的一些原因。

  2. 存储库不存储您的实体。

  3. 有些事情与您的交易无关,导致您看不到变化(我实际上在投注这一项)。

为了排除(1)把一个断点或旁边referenciacaoRepository.savereferenciacaoRepository.saveAndFlush语句记录声明,保证,该代码路径被执行。

为了排除(2)激活SQL日志记录,查看SQL语句是否实际按预期执行。很显然,你应该看到插入语句得到执行。

要解决第三个问题,请激活事务日志记录以查看事务何时开始和结束。在保存之前应该有一个事务入门,然后再进行提交。验证这是否真的发生,并且没有其他事务正在运行。

让我们知道您是否能够解决您的问题。

附注:为什么你有ReferenciacaoSession?它确实没有做任何事情,似乎完全可以由存储库替换。

+0

谢谢@JensSchauder,但我不得不再次做我的课,问题就消失了......现在我在不同的类中遇到了同样的问题,但我试图调试它。 –