简单的问题。这是代码:
public void insertDefacer(Defacer defacer) {
try {
em.persist(defacer);
} catch (PersistenceException | DatabaseException e) {
defacer = em.find(Defacer.class, defacer.getIdentity());
defacer.setStats(defacer.getStats() + 1);
em.merge(defacer);
}
}
当 defacer 已存在于数据库(mysql)中时,persist
操作会抛出异常(PersistenceException
和/或{{1} })。这似乎很正常。所以我想抓住这些例外并威胁他们。但在记录这些异常后,我的程序突然结束(没有完成方法)。
为什么?
详细信息(可能很重要或不重要): em 是 EntityManager 通过 @PersistenceContext
答案 0 :(得分:0)
您是否正在尝试这种方式来获取EntityManager?
function flatten() {
// variable number of arguments, each argument could be:
// - array
// array items are passed to flatten function as arguments and result is appended to flat array
// - anything else
// pushed to the flat array as-is
var flat = [],
i;
for (i = 0; i < arguments.length; i++) {
if (arguments[i] instanceof Array) {
flat = flat.concat(flatten.apply(null, arguments[i]));
} else {
flat.push(arguments[i]);
}
}
return flat;
}
// flatten([[[[0, 1, 2], [0, 1, 2]], [[0, 1, 2], [0, 1, 2]]], [[[0, 1, 2], [0, 1, 2]], [[0, 1, 2], [0, 1, 2]]]]);
// [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
答案 1 :(得分:0)
我找到了另一种选择。只需看看代码:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void insertDefacer(Defacer defacer) {
Defacer df = em.find(Defacer.class, defacer.getIdentity());
if(df == null) {
em.persist(defacer);
System.out.println("Save");
} else {
em.merge(defacer);
System.out.println("Update");
}
}
正如我所说,这是一个 姑息解决方案 。谢谢你的帮助。
答案 2 :(得分:0)
确保PersistenceExcetion属于hibernate包。