我正在使用GlassFish4、Spring和PostgreSQL。我想将一个实体保存到数据库中,但当我尝试时,我得到了一个异常:
其实这对我来说毫无意义。我甚至不知道去哪里看,因为消息的描述性不是很强。您知道如何检索有关此异常的更多信息吗?或者援引它的理由是什么?
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="amleto-server-model" transaction-type="JTA">
<jta-data-source>jdbc/amleto</jta-data-source>
<class>com.amleto.server.model.entities.FacebookDebug</class>
<properties>
<property name="openjpa.jdbc.Schema" value="public"/>
<property name="openjpa.TransactionMode" value="managed" />
<property name="openjpa.ConnectionFactoryMode" value="managed" />
<property name="openjpa.jdbc.DBDictionary" value="postgres" />
<!-- Log all queries performed against the database. -->
<!-- Do not use in production, this will generate a lot of output. -->
<property name="openjpa.Log" value="SQL=TRACE"/>
</properties>
</persistence-unit>
amletoController.java:
package com.amleto.server.services.controllers;
import java.sql.Timestamp;
import java.util.GregorianCalendar;
import javax.persistence.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.amleto.server.model.entities.FacebookDebug;
import com.amleto.server.services.utils.SharedEntityManager;
@Controller
public class AmletoController {
@Autowired
SharedEntityManager entityManager;
@Transactional
@ResponseBody
@RequestMapping(value = "/facebookDebug", method=RequestMethod.GET)
public String facebookDebug(@RequestParam(value="action", required=true) String action,
@RequestParam(value="userId", required=true) String userId) {
FacebookDebug fb = new FacebookDebug();
fb.setAction(action);
fb.setUserId(userId);
GregorianCalendar dateCreate = new GregorianCalendar();
fb.setDateCreate(new Timestamp(dateCreate.getTimeInMillis()));
entityManager.getEntityManager().persist(fb);
/*
int returnValue = entityManager.getEntityManager().createNativeQuery("insert into facebook_debug (action, user_id, date_create) values(?,?,current_timestamp)")
.setParameter("1", action)
.setParameter("2", userId)
.executeUpdate();
*/
return "why it doesn't work?";
}
}
facebookdebug.java:
package com.amleto.server.model.entities;
import java.io.Serializable;
import javax.persistence.*;
import java.sql.Timestamp;
/**
* The persistent class for the facebook_debug database table.
*
*/
@Entity
@Table(name="facebook_debug")
@NamedQuery(name="FacebookDebug.findAll", query="SELECT f FROM FacebookDebug f")
public class FacebookDebug implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="facebook_debug_id")
private Integer facebookDebugId;
private String action;
@Column(name="date_create")
private Timestamp dateCreate;
@Column(name="user_id")
private String userId;
public FacebookDebug() {
}
public Integer getFacebookDebugId() {
return this.facebookDebugId;
}
public void setFacebookDebugId(Integer facebookDebugId) {
this.facebookDebugId = facebookDebugId;
}
public String getAction() {
return this.action;
}
public void setAction(String action) {
this.action = action;
}
public Timestamp getDateCreate() {
return this.dateCreate;
}
public void setDateCreate(Timestamp dateCreate) {
this.dateCreate = dateCreate;
}
public String getUserId() {
return this.userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
SharedEntityManager.java:
package com.amleto.server.services.utils;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SharedEntityManager implements ApplicationContextAware {
private static ApplicationContext _appCtx;
@PersistenceContext(name="amleto-server-model")
private EntityManager em;
private static SharedEntityManager instance;
public static SharedEntityManager getInstance() {
if(instance == null) {
instance = new SharedEntityManager();
}
return instance;
}
public EntityManager getEntityManager() {
if(this.em == null) {
this.em = _appCtx.getBean(EntityManager.class);
}
return this.em;
}
@Override
public void setApplicationContext(ApplicationContext appCtx) throws BeansException {
_appCtx = appCtx;
}
}
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
我回到事务回滚异常,只是在上面的堆栈跟踪中链接。在将附加配置添加到GlassFish日志配置之后,我在异常发生之前获得了以下堆栈跟踪:
[2015-09-21T18:36:15.256+0200][glassfish 4.1][CONFIG][org.eclipse.persistence.session.file:/c:/glassFish4/glassfish/domains/domain2/eclipseapps/amleto-server-ear/amleto-server-services-ws_war/web-inf/lib/amleto-server-model-0.1.0-snapshot.jar_amleto-server-model-0.1.0-snapshot.jar_amleto-server-model.connection]
[2015-09-21T18:36:15.261+0200][glassfishPostgreSQL版本:9.4.4驱动程序:PostgreSQL本机驱动程序版本:PostgreSQL 9.4 JDBC4(build 1202)]]
[2015-09-21T18:36:15.582+0200][glassfish 4.1][信息][org.eclipse.persistence.session.file:/c:/glassFish4/glassfish/domains/domain2/eclipseapps/amleto-server-ear/amleto-server-services-ws_war/web-inf/lib/amleto-server-model-0.1.0-Snapshot.jar_amleto-server-model.connection][tid:_threadid=27_threadname=http-listener-1(2)]
[2015-09-21T18:36:15.858+0200][glassfish 4.1][FINE][org.eclipse.persistence.session.file:/c:/glassFish4/glassfish/domains/domain2/eclipseapps/amleto-server-ear/amleto-server-services-ws_war/web-inf/lib/amleto-server-model-0.1.0-Snapshot.jar_amleto-server-model-0.1.0-Sql][tid:_thread=27_threadname=http-listener-1(2)]
我猜问题是由于找不到桌子造成的,但我现在还不知道确切的原因。
您可以尝试以下操作:
在persistence.xml
中添加以下内容:
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
更新#1:
您可以尝试打印嵌套异常stacktrace,如下所示:
try {
entityManager.getEntityManager().persist(fb);
} catch (Exception x) {
if (x.getCause() != null) {
x.getCause().printStackTrace();
if (x.getCause().getCause() != null) {
x.getCause().getCause().printStackTrace();
}
}
}
问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此
现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?
我有一个带有的堆栈跟踪: [...]原因:ch.ethz.id.wai.lakshmi.engine.common.lakshmiException:处理用户事务时出错。在ch.ethz.id.wai.lakshmi.engine.common.TransactionHelper.commitTransaction(TransactionHelper.java:79)在ch.ethz.id.wai
Edit2 @Paradematic在建议重定向而不是抛出异常方面做得很好;这解决了日志记录问题。Play 2中的问题是,重定向需要发生在所谓的范围内,而日期解析器调用并不总是这样。 最初的 有一个问题,即我的application.log被与uri日期解析器操作相关的错误填满,如果给定有效的uri日期,该操作应该成功。 然而,一些用户试图通过输入无效日期来规避这一点,希望获得免费访问付费订阅者专
我试过大多数设置日志记录/应用程序洞察遥测的组合,下面是我试过的一些东西: 的 方法中的 将添加到中的日志生成器 删除自定义错误页异常处理程序,以防发生影响事件 我在Azure中的Web应用程序上设置了环境变量。 我正在使用以下代码生成应用程序洞察中的异常: 一切都不起作用了,我快疯了!非常感谢任何帮助。
问题内容: 如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。 问题答案: 可以接受or或参数: 也就是说,请考虑将SLF4J之类的记录器接口与LOGBack或log4j之类的记录实现一起使用。