gpt4 book ai didi

java - Hibernate : session. get(...) 与 session.getNamedQuery(...)

转载 作者:行者123 更新时间:2023-11-30 08:08:36 25 4
gpt4 key购买 nike

在交易过程中,我创建/保存一个对象,并在交易结束时再次读取对象(在设置历史事件之前)

@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 始终为空值。在将 Actor 保存到 session 中但不将其保存到数据库之前调用的方法 creerActeur(Integer pkDeclaration, Acteur acteur) 。事实上,actor 仅在事务结束时才被持久化。

当我们从 session 中获取对象时,问题就解决了session.get(Acteur.class, pkActeur)。我得到了我想要的对象 Actor 。

我的问题是:为什么当我执行查询“Declaration_Acteur_Complet”时看不到对象参与者(在数据库中)?是否涉及不止一项交易?session.get(...)session.getNamedQuery(...) 之间有什么区别?

感谢您的帮助。

最佳答案

What is the difference between session.get(...) and session.getNamedQuery(...)?

  • session.get(MyClass.class, id)将从数据库加载具有相应id的实体MyClass
  • session.getNamedQuery('myNamedQuery').uniqueResult() 将执行命名查询

Why I can't see the objet actor (in DB) when I execute the Query "Declaration_Acteur_Complet"?

这取决于命名查询“Declaration_Acteur_Avec_Assurance”背后的内容。它位于代码中的其他位置。也许是 Acteur 类或在 xml 文件中。

Are there more than one transaction concerned?

没有

关于java - Hibernate : session. get(...) 与 session.getNamedQuery(...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30726971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com