gpt4 book ai didi

java - 检查表然后保存/更新 Hibernate 的正确做法

转载 作者:行者123 更新时间:2023-12-01 17:56:00 25 4
gpt4 key购买 nike

所有使用hibernate的应用程序都需要保存和更新才能与数据库交互。为了保存,我将检查某些标准是否存在。如果不存在,我会保存。对于更新,我会检查是否存在以及某些标准来确定是否更新。检查并保存/更新的最佳实践是什么?

我目前正在创建一个单独的函数,用于打开 session 并搜索以确定是否存在。 session 打开/关闭非常笨拙。我认为应该有更好的方法来做到这一点。

public Event searchByDateAddress(Date _date, String _address, boolean _closeSess)
{
try
{
if(!session.isOpen())
{
session = HibernateUtil.getSessionFactory().openSession();
}
session.beginTransaction();
Criteria criteria = session.createCriteria(Event.class);
criteria.add(Restrictions.eq("date", _date));
criteria.add(Restrictions.eq("address", _address));
criteria.setFetchMode("organizerProfile", FetchMode.JOIN);
Event evt = (Event)criteria.uniqueResult();
if(_closeSess)
{
session.close();
}
if (evt==null)
{
LogUtils.logInfo("The event does not exist: " + _date + " " + _address);
return null;
}
else
{
return evt;
}
}
catch(Exception e)
{
LogUtils.logInfo(e.toString());
if(_closeSess)
{
session.close();
}
return null;
}
}


public EventDTO insertEvent(Event _event)
{
try
{
Event tmpEvent=new Event();
//Event not exists
if((tmpEvent=this.searchByDateAddress(_event.getDate(), _event.getAddress(), true))==null)
{
//insert
if(!session.isOpen())
{
session = HibernateUtil.getSessionFactory().openSession();
}
Transaction tx=session.beginTransaction();
long retOid=(Long)session.save(_event);
session.flush();
tx.commit();
session.close();
_event.setOid(retOid);
return new EventDTO(_event);
}
}
catch(Exception e)
{
e.printStackTrace();
session.close();
}
return new EventDTO();
}

谢谢

最佳答案

关于 session 处理,最好在 API 级别进行处理,即“EventService”之前的级别。因此,您始终假设 session 在服务方法中可用。那么代码会看起来更需要,避免使用 hibernate 查询进行 session 。

还可以在需要 session 的方法中使用@Transactional 属性来完全避免 session 处理。使用 Spring 可以实现这一点。看:https://spring.io/guides/gs/managing-transactions/了解更多信息。

要检查表中是否包含带有 where 子句的数据,可以使用 count(*)。所以你不需要一开始就获取所有数据。

看这个例子:hibernate native query, count

关于java - 检查表然后保存/更新 Hibernate 的正确做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60716970/

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