【发布时间】:2015-06-09 08:38:41
【问题描述】:
在事务过程中,我创建/保存一个对象,并在事务结束时再次读取对象(在设置历史事件之前)
@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;
}
}
DAO
@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.get(Acteur.class, pkActeur) 中获取对象时,问题就解决了。
我得到了我想要的对象演员。
我的问题是:
为什么我在执行查询“Declaration_Acteur_Complet”时看不到对象参与者(在 DB 中)?是否涉及不止一项交易?
session.get(...)和session.getNamedQuery(...)有什么区别?
感谢您的帮助。
【问题讨论】:
-
session.getNamedQuery(...) 在您的情况下执行由名称标识的给定查询 'Declaration_Acteur_Avec_Assurance', session.get(Acteur.class, pkActeur) 执行简单的 SELECT * FROM ActeurTable WHERE ActeurPK = pkActeur.
标签: java hibernate dao hibernate-session