我正在使用 Wildfly16 + Eclipselink2.6.0 和一个 EAR 项目。数据库是 Postgresql。我有一些实体:
- 组:商店组
- Shop : 与 Group 有 n:1 关系的商店。
- 增值税:增值税信息,n:1 与集团。
这些是实体(摘录):
@Entity
@Cacheable(value = false)
public class ShoppingCart {
...
@JoinColumn(name = "idpv",referencedColumnName = "ID",nullable = false)
@ManyToOne(fetch = FetchType.EAGER)
@JsonSerialize(using = StandardJsonSerializer.class)
private Shop shop;
...
}
@Entity
public class Shop implements Serializable {
@ManyToOne(targetEntity = Group.class, fetch = FetchType.EAGER )
@JoinColumn(name = "idgroup", referencedColumnName = "ID", nullable = false)
private Group group;
}
@Entity
@Cacheable(false)
public class Group implements Serializable {
...
}
@Entity
public class VAT implements Serializable {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "idgroup",referencedColumnName = "ID")
private Group group;
}
这是代码:
@PersistenceContext(unitName = "MyPU")
private EntityManager em;
...
public void createInvoice(Long idcart){
ShoppingCart c = this.entitymanager.find(ShoppingCart.class, idcart);
if(c == null){
throw new BssException("Cart not found");
}
Shop shop = c.getShop();
if(shop != null){
LOG.log(Level.INFO, "Invoice for shop {0}", new Object[]{shop.getCode()});
RowInvoice rowTrasp = new RowInvoice();
...
List<VAT> lVat = this.em.createNamedQuery("VAT.findVATGroup", VAT.class)
.setParameter("idgroup", shop.getGroup().getId()) // <- row 265
.setParameter("vat", 22.00)
.getResultList();
...
}
}
这就是 JPQL 查询。
SELECT i FROM VAT i
WHERE i.group.id = :idgroup AND i.value = :vat
所以:我想从百分比值为 22.00% 的组中获取增值税信息。我在制作发票时使用该功能。
我可以开很多发票,但是从一个随机的时刻开始,我不能再开发票了。如果我重新启动 Wildfly,而不更改数据库上的任何数据,发票就会开始工作。
异常堆栈跟踪是:
Caused by: java.lang.NullPointerException
at com.bsssrl.bssspesaweb_ejb.GeneratoreFatture.creaTestataDocumentoStd(GeneratoreFatture.java:265)
at sun.reflect.GeneratedMethodAccessor790.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
我不会更改组、商店或增值税,它们是静态信息(自 2018 年以来未更新)。每天我都会用这些数据制作很多购物车和发票。
为什么使用相同方法的相同记录会引发该错误并且在重新启动后工作?我想这可能是缓存问题。我该如何验证呢?
这不是数据库连接问题,因为其他操作工作正常。相同的数据用于制作购物车。所有其他查询都有效。