gpt4 book ai didi

java - java 与 hibernate 中的事务问题 - 未从数据库中提取最新条目

转载 作者:行者123 更新时间:2023-12-01 05:57:18 25 4
gpt4 key购买 nike

我的应用程序中似乎遇到了交易问题。我正在使用 Java 1.6 和 Hibernate 3.2.5。

我的应用程序每月运行一个流程,根据每个用户的每月 Activity 为数据库中的每个用户创建计费条目。然后,这些帐单条目用于创建每月帐单对象。流程为:

  1. 获取过去一个月有 Activity 的用户
  2. 为每个用户创建相关的结算条目
  3. 获取我们刚刚创建的一组结算条目
  4. 根据这些条目创建每月账单

在执行上述步骤 3 之前一切正常。帐单条目已正确创建(如果我在帐单条目创建方法之后添加断点,我可以在数据库中看到它们),但它们不会从数据库中提取。结果,生成了不正确的每月账单。

如果我再次运行代码(不清除数据库),则会创建新的帐单条目,并且步骤 3 会提取在第一次运行中创建的条目(但不是第二次运行)。对我来说,这非常令人困惑。

我的代码如下所示:

for (User user : usersWithActivities) {

createBillingEntriesForUser(user.getId());

userBillingEntries = getLastMonthsBillingEntriesForUser(user.getId());

createXMLBillForUser(user.getId(), userBillingEntries);
}

调用的方法如下所示:

@Transactional
public void createBillingEntriesForUser(Long id) {

UserManager userManager = ManagerFactory.getUserManager();
User user = userManager.getUser(id);
List<AccountEvent> events = getLastMonthsAccountEventsForUser(id);
BillingEntry entry = new BillingEntry();

if (null != events) {

for (AccountEvent event : events) {

if (event.getEventType().equals(EventType.ENABLE)) {
Calendar cal = Calendar.getInstance();

Date eventDate = event.getTimestamp();
cal.setTime(eventDate);

double startDate = cal.get(Calendar.DATE);
double numOfDaysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
double numberOfDaysInUse = numOfDaysInMonth - startDate;

double fractionToCharge = numberOfDaysInUse/numOfDaysInMonth;

BigDecimal amount = BigDecimal.valueOf(fractionToCharge * Prices.MONTHLY_COST);
amount.scale();
entry.setAmount(amount);
entry.setUser(user);
entry.setTimestamp(eventDate);

userManager.saveOrUpdate(entry);
}


}

}

}


@Transactional
public Collection<BillingEntry> getLastMonthsBillingEntriesForUser(Long id) {

if (log.isDebugEnabled())
log.debug("Getting all the billing entries for last month for user with ID " + id);

//String queryString = "select billingEntry from BillingEntry as billingEntry where billingEntry>=:firstOfLastMonth and billingEntry.timestamp<:firstOfCurrentMonth and billingEntry.user=:user";
String queryString = "select be from BillingEntry as be join be.user as user where user.id=:id and be.timestamp>=:firstOfLastMonth and be.timestamp<:firstOfCurrentMonth";

//This parameter will be the start of the last month ie. start of billing cycle
SearchParameter firstOfLastMonth = new SearchParameter();
firstOfLastMonth.setTemporalType(TemporalType.DATE);

//this parameter holds the start of the CURRENT month - ie. end of billing cycle
SearchParameter firstOfCurrentMonth = new SearchParameter();
firstOfCurrentMonth.setTemporalType(TemporalType.DATE);

Query query = super.entityManager.createQuery(queryString);

query.setParameter("firstOfCurrentMonth", getFirstOfCurrentMonth());
query.setParameter("firstOfLastMonth", getFirstOfLastMonth());
query.setParameter("id", id);

List<BillingEntry> entries = query.getResultList();

return entries;
}

public MonthlyBill createXMLBillForUser(Long id, Collection<BillingEntry> billingEntries) {

BillingHistoryManager manager = ManagerFactory.getBillingHistoryManager();
UserManager userManager = ManagerFactory.getUserManager();

MonthlyBill mb = new MonthlyBill();
User user = userManager.getUser(id);

mb.setUser(user);
mb.setTimestamp(new Date());

Set<BillingEntry> entries = new HashSet<BillingEntry>();
entries.addAll(billingEntries);

String xml = createXmlForMonthlyBill(user, entries);
mb.setXmlBill(xml);
mb.setBillingEntries(entries);
MonthlyBill bill = (MonthlyBill) manager.saveOrUpdate(mb);
return bill;

}

非常感谢有关此问题的帮助,因为它已经困扰我好几个星期了!

提前致谢,齿轮。

最佳答案

您的顶级方法也是事务性的吗?如果是的话,大多数时候我都遇到过这种问题,这是 hibernate 没有在正确的时间完成的刷新。

尝试在 getLastMonthsBillingEntriesForUser 方法的开头添加对 session.flush() 的调用,看看它是否能解决您的问题。

关于java - java 与 hibernate 中的事务问题 - 未从数据库中提取最新条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2476419/

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