2017-05-15 102 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,但我不得不再次做我的課,問題就消失了......現在我在不同的類中遇到了同樣的問題,但我試圖調試它。 –