在事务过程中,我创建/保存一个对象,并在事务结束时再次读取对象(在设置历史事件之前)
@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的空值。在会话中保存演员之前调用的方法creerActeur(Integer pkDeclaration, Acteur acteur)
,但不将其保存到数据库中。实际上,actor 仅在事务结束时才被持久化。
当我们从 session 中获取对象时,问题就解决了session.get(Acteur.class, pkActeur)
。我得到了我想要的对象演员。
我的问题是:为什么我在执行查询“Declaration_Acteur_Complet”时看不到对象参与者(在 DB 中)?是否涉及不止一项交易?session.get(...)
和 和有什么不一样session.getNamedQuery(...)
?
谢谢你的帮助。