1

トランザクションプロセスでオブジェクトを作成/保存し、トランザクションの最後にオブジェクトを再度読み取ります(履歴イベントを設定する前)

@org.springframework.stereotype.Service
@Transactional(value="transactionManager")
public class UTServiceImpl implements UTService {
    private static final Logger logger = Logger.getLogger(UTServiceImpl.class);
    ...

    @Autowired
    private DeclarationDao declarationDao;
...

public Integer ajouterPersonneImpliquee(ContexteService contexte, Integer pkQualification, Integer pkUT, Acteur personneImpliquee) throws ExceptionValidation {
...

            pk = declarationDao.creerActeur(pkDeclaration, personneImpliquee);

....        

        // History
        personneImpliquee = declarationDao.rechercherActeurAvecAssurance(personneImpliquee.getPk());
        creerActeGestionActeur(creationActeur, personneImpliquee, contexte.getIdentifiantUtilisateur(), declaration, ut);

        return pk;
    }
}

ダオ

@Repository
public class DeclarationDaoImpl implements DeclarationDao { 
    private Logger logger;  

    @Autowired @Qualifier("sessionFactorySinistre")
    private SessionFactory sf;

    public DeclarationDaoImpl() {

    }
....

 public Integer creerActeur(Integer pkDeclaration, Acteur acteur) {
        final Session session = sf.getCurrentSession();

        // On retrouve la déclaration
        Declaration declaration = (Declaration) session.get(Declaration.class, pkDeclaration);
        if (declaration == null) {
            throw new ExceptionPkEntiteInconnu(Declaration.class, pkDeclaration);
        }

        // On ne persiste pas la personne quand c'est un sociétaire, appel NOA systématique
        if (Acteur.TYPE_SOCIETAIRE.equals(acteur.getTypePersonne())) {
            acteur.setPersonne(null);
        }

        declaration.getActeurs().add(acteur);
        session.save(acteur);
        return acteur.getPk();
    }
...
    public Acteur rechercherActeurAvecAssurance(Integer pkActeur) {
        final Session session = sf.getCurrentSession();

        Query query = session.getNamedQuery("Declaration_Acteur_Avec_Assurance");
        query.setInteger(0, pkActeur.intValue());
        Acteur acteur = (Acteur) query.uniqueResult();

        // On met la personne en cas de sociétaire
        if (Acteur.TYPE_SOCIETAIRE.equals(acteur.getTypePersonne())) {
            // Il faut ABSOLUMENT détacher l'objet de la session pour ne pas persister la personne rajoutee au flush !!!
            session.evict(acteur);
        }
        return acteur;
    }
...
}

私が使用するときsession.getNamedQuery(...)。オブジェクトacteurの値は常にnullです。アクターをセッションに保存する前に呼び出されたメソッドcreerActeur(Integer pkDeclaration, Acteur acteur)ですが、データベースに保持しません。実際、アクターはトランザクションの最後にのみ永続化されます。

セッションからオブジェクトを取得すると、問題は解決しますsession.get(Acteur.class, pkActeur)。私は望むようにオブジェクトacteurを手に入れました。

私の質問は次のとおりです。クエリ「Declaration_Acteur_Complet」を実行すると、(DB で) オブジェクト アクターが表示されないのはなぜですか? 複数のトランザクションが関係していますか? session.get(...)とはどう違いsession.getNamedQuery(...)ますか?

助けてくれてありがとう。

4

3 に答える 3

0

回答ありがとうございます。

hbm.xml で「Declaration_Acteur_Avec_Assurance」をクエリします。

<query name="Declaration_Acteur_Avec_Assurance"><![CDATA[
        select act from com.prima.solutions.primaclaims.core.modele.sinistre.declaration.Acteur act
        left join fetch act.personne
        left join fetch act.assureur assu left join fetch assu.personne
        left join fetch act.intermediaire inter left join fetch inter.personne
        left join fetch act.correspondantAssureur corr left join fetch corr.personne
        where act.pk = ?
    ]]></query>

しないことで問題を解決しました

personneImpliquee = declarationDao.rechercherActeurAvecAssurance(personneImpliquee.getPk());

実際、オブジェクト「personneImpliquee」があり、プロセスでこのメソッドを呼び出す必要はありません。参考までに、古いアプリケーションを最新のテクノロジでリファクタリングします。

于 2015-06-09T14:46:42.573 に答える