トランザクションプロセスでオブジェクトを作成/保存し、トランザクションの最後にオブジェクトを再度読み取ります(履歴イベントを設定する前)
@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(...)
ますか?
助けてくれてありがとう。