2017-05-15 22 views
0

私はVaadinを使用してアプリケーションを開発していますが、何か問題があります: Hibernateで保存してオブジェクトしようとすると、それ。私のクラスから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文に次のloggingステートメントを入れて、そのコードパスが実行されます。

SQLロギングを有効にすることを排除するために、SQL文が実際に期待どおりに実行されるかどうかを確認するためです。明らかに、になるはずです。

3つ目の問題に取り組むには、トランザクションのログをアクティブにして、トランザクションの開始と終了を確認します。保存して後にコミットする前にトランザクションを開始する必要があります。これが実際に行われ、他のトランザクションが実行されていないことを確認します。

あなたの問題を解決できたかどうかをお知らせください。

サイドノート:なぜReferenciacaoSessionを持っていますか?実際には何もしませんし、リポジトリによって完全に置き換えられるようです。

+0

ありがとう@JensSchauderしかし、私は再びクラスをやり直す必要があり、問題は消えました...今は別クラスで同じ問題が発生していますが、デバッグしようとしています。 –

関連する問題