我有一个hibernate和JSF2应用程序进入部署服务器,突然抛出一个org。冬眠AssertionFailure:异常中的空id。我将立即提供堆栈跟踪和代码,但首先有四个重要问题:
>
这只发生在部署服务器(Jboss)上
研究这一点,人们在尝试插入对象时似乎会出现这种错误。但是当我做一个简单的查询时,我得到了错误。(实际上,各种不同的查询,因为错误会随机出现在多个页面上。)
错误只会偶尔出现。如果我重新启动Jboss,它会消失,但一段时间后会返回。而且,它并不一致,在一些点击上它在那里,在另一些点击上它不在那里。即使当它点击时,当我对页面进行简单刷新时,它也会很好地返回。
我使用的是c3p0(配置如下)
知道这是怎么回事吗?
代码详细信息:
这发生在地址对象上。以下是完整的hbm:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.idex.auctions.model">
<class name="Address" table="address" lazy="true">
<id name="addressID" column="AddressID">
<generator class="native"/>
</id>
<property name="street" column="street"/>
<property name="city" column="city"/>
<property name="zip" column="zip"/>
<property name="state" column="state"/>
<property name="region" column="region"/>
<property name="country" column="country"/>
<many-to-one name="user"
class="com.idex.auctions.model.User"
column="userid"
unique="true"
cascade="save-update"/>
</class>
</hibernate-mapping>
Java类是直截了当的:
public class Address implements Serializable {
private static final long serialVersionUID = 7485582614444496906L;
private long addressID;
private String street;
private String city;
private String zip;
private String state;
private String region;
private String country;
private User user;
public Address() {
}
public long getAddressID() {
return addressID;
}
public void setAddressID(long addressID) {
this.addressID = addressID;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
c3p0配置:
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">1000</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
使用的版本是
hibernate3.jar
c3p0-0.9.1.2.jar
myfaces-api-2.1.4.jar
myfaces-impl-2.1.4.jar
mysql-connector-java-5.1.20-bin.jar
完整的堆栈跟踪
org.hibernate.AssertionFailure: null id in com.idex.auctions.model.Address entry
(don't flush the Session after an exception occurs)
org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(
DefaultFlushEntityEventListener.java:78)
org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(
DefaultFlushEntityEventListener.java:187)
org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(
DefaultFlushEntityEventListener.java:143)
org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(
AbstractFlushingEventListener.java:219)
org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(
AbstractFlushingEventListener.java:99)
org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(
DefaultAutoFlushEventListener.java:58)
org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:997)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1142)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
com.idex.auctions.manager.DatabaseManager.getAllObjects(DatabaseManager.java:464)
com.idex.auctions.ui.NavBean.gotoHome(NavBean.java:40)
sun.reflect.GeneratedMethodAccessor350.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:735)
javax.el.BeanELResolver.invoke(BeanELResolver.java:467)
javax.el.CompositeELResolver.invoke(CompositeELResolver.java:246)
org.apache.el.parser.AstValue.getValue(AstValue.java:159)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(
ContextAwareTagValueExpression.java:96)
javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:246)
javax.faces.component.UIOutcomeTarget.getOutcome(UIOutcomeTarget.java:50)
org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils.getOutcomeTargetHref(
HtmlRendererUtils.java:1542)
org.apache.myfaces.shared.renderkit.html.HtmlLinkRendererBase.renderOutcomeLinkStart(
HtmlLinkRendererBase.java:908)
org.apache.myfaces.shared.renderkit.html.HtmlLinkRendererBase.encodeBegin(
HtmlLinkRendererBase.java:143)
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:502)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:744)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:758)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:758)
org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(
FaceletViewDeclarationLanguage.java:1900)
org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285)
com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView(
PrettyViewHandler.java:163)
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
org.apache.myfaces.tomahawk.application.ResourceViewHandlerWrapper.renderView(
ResourceViewHandlerWrapper.java:93)
com.idex.auctions.ui.CustomViewHandler.renderView(CustomViewHandler.java:98)
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:115)
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)
com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126)
com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)
@asdcjunior回答正确。在抛出异常之前发生了一些事情。
在这种情况下(当您针对一个测试处理单个事务时,这种情况经常发生在集成测试中——例如@transaction annotation),我调用的方法是:
session.clear()
这很有帮助,因为所有“脏”对象都已从当前会话中删除,所以在执行下一次刷新时,问题不会出现。
示例流程:
示例正确的流程:
希望有帮助;)
我敢打赌并发问题,但它可能发生在不同的级别:
除了这些潜在的麻烦来源,我会删除c3p0(可能只是谣言…)因为您的堆栈已经提供了数据源
,连接池与事务管理器集成。
例外情况:
org.hibernate.AssertionFailure:条目中的null id(发生异常后不要刷新会话)
告诉我们会话异常发生在这个org的点之前。冬眠将抛出断言失败
。
确切地说,org。冬眠断言失败
在会话时引发。flush()
正在发生,而不是发生错误的地方。
以上是一个事实,因此从中可以得出一个可能的结论:可能有什么东西在压制最初的例外。
因此,寻找其他可能的错误点:一个保存()
或保存或更新()
可能试图持久化一个具有null
字段的实体,其中,在表中,列是不NULL
?
提示:为了帮助调试,请尝试添加会话。flush()
每次与会话
对象交互后(例如Session.save(obj)
,会话)。合并(obj)
等),这将有望导致组织。冬眠断言失败
发生得更早,更接近真正问题发生的地方。(当然,在调试之后,删除那些session.flush()
)
在我的例子中,真正的异常发生在一个尝试/捕获块中,其中捕获
抑制了异常(没有重新抛出或警告我)。
编辑:得到一个-1,你能解释一下为什么吗?我搜索了重复项,但没有找到任何重复项。 为我刚刚遇到的问题发布Q/a: 例外情况: org.hibernate.AssertionFailure: null id in xyz (在发生异常后不要刷新会话)
我试图在一个catch块中执行一些更新操作。冬眠例外ConstraintViolationException抛出如下 我正在使用Hibernate 4.3.6 这是我的UserRegistrationRequest实体 这是我的UserSecurityQuestions实体 尝试在catch块中执行更新时,我遇到以下错误 如果我抓住异常而不是约束违反异常看到下面的错误 有人能帮帮我吗,有没有更好的
你好,我是PHP中的web开发人员,最近迁移到javaEE。我在mysql中创建表。这是第一类: . . . 这是我的第二节课: . . .
我设置了一个非常基本的Grails 3 web应用程序,使用jdbc连接到PostgreSQL数据库。下面您可以找到< code>Cluster域类和专用服务的代码。 碰巧用同一个< code>slug参数调用了< code>createCluster方法两次: 导致以下异常 我以为违反一约束会被方法拦截,但显然我错了。好吧,所以我添加了一个try/catch,但它基本上没有效果,异常没有被包装,
问题内容: 当取消注释时,我们将在第二种方法中获得en异常- 当作者。 为什么会这样呢? 问题答案: 问题似乎是Hibernate引发了一个异常(因此当前事务无效),但是随后您尝试在该会话中继续执行更多操作。 正确的方法是将您使用的测试分为2部分,一部分测试空作者,另一部分测试有效作者。 在生产代码(例如控制器)上,您需要重新启动操作(关闭事务,重新启动流程)才能继续。但是,考虑到游戏管理交易的方
问题内容: 我有两节课: 用户 还有另一个这样的类: 角色 : 我写了这样的集成测试: 此测试工作正常。但是,当我将以下行添加到上面的测试代码中时: 我收到这样的错误: 这是怎么回事?我哪里错了? 我正在使用Grails 2.0。 提前致谢。 问题答案: 出现此错误的原因是,当执行语句Role.findBy静态方法时,Hibernate(grails GORM使用)将检查是否需要“ autoFlu