我有一个hibernate和JSF2应用程序去部署服务器,突然抛出一个org.hibernate.AssertionFailure:空id在例外。 我将立即提供堆栈跟踪和代码,但首先有四个重要问题:
这只发生在部署服务器上(在Windows Sever 2008上运行的Jboss和MysqL)。在我的开发机器上运行(在Windoes 7 Pro上运行的Tomcat和MysqL),也不在临时环境(运行在Linux上的Jboss和MysqL 。)
研究这一点,似乎人们试图插入一个对象时会出现这个错误。 但是当我正在做一个简单的查询时,我得到了错误。 (各种不同的查询,实际上,随着错误随机popup几页)。
该错误只是偶尔一次。 如果我做了一个Jboss重启,它会消失,但一段时间后返回。 另外,这不是一致的,有的点击就在那里,有的则不是。 即使它命中,当我做一个简单的刷新页面,它返回罚款。
如何知道Windows何时进入/退出睡眠或hibernate模式?
睡眠()是一个糟糕的devise,但似乎是我唯一的select
java.net.socketException:太多打开文件Spring Hibernate Tomcat
org.hibernate.hql.internal.ast.QuerySyntaxException:<table_name>未映射
Windows 10睡眠问题。 graphics消失
我正在使用c3p0(config下面)
任何想法发生了什么?
代码详细信息:
这发生在地址对象上。 这里是完整的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; } }
c3p0configuration:
<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)
我怎样才能永久绕过Windows XP的启动?
试图修改标识列“ID”
从hibernate模式退出时,WPF应用程序会失败
数据库共享两台服务器
例外:
org.hibernate.AssertionFailure:条目中的空id(在异常发生后不刷新会话)
告诉我们会话异常发生在这个org.hibernate.AssertionFailure被抛出之前。
确切地说,当session.flush()发生时,会引发org.hibernate.AssertionFailure ,而不是发生错误的地方。
以上是事实,因此可以从中得出一个结论:可以压制原来的例外。
所以寻找其他可能的错误点:一个save()或saveOrUpdate()可能试图坚持一个null字段的实体,其中,在表中,该列是NOT NULL ?
提示:为了帮助进行调试,在每次与Session对象(例如session.save(obj) , session.merge(obj)等)交互之后,尝试添加一个session.flush() ),这将有希望导致org.hibernate.AssertionFailure发生的更早,更接近真正的问题发生的地方。 (当然,在调试之后,删除那些session.flush() 。)
在我的情况下, 真正的异常发生在一个try/catch {}块内, catch阻止异常(没有重新抛出或警告我)。
我敢打赌一个并发问题,但它可能发生在不同的层面:
如果传统的“打开会话”模式没有正确实现,那么休眠会话可能会在不同的用户之间共享
由于不适当的休眠缓存设置 ,实体在两个用户会话之间共享
一个JDBC连接在两个不同的hibernate会话之间共享(不太可能)
除了这些潜在的麻烦来源之外,我会删除c3p0(也许只是传闻…),因为你的堆栈已经提供了与事务管理器集成的连接池的DataSource 。
@asdcjunior已经正确回答了。 抛出异常之前发生了一些事情。
在这种情况下(当你为一个测试处理单个事务时,经常在集成测试中发生 – 例如@Transaction注释),我正在调用方法:
session.clear()
这有帮助,因为所有的“脏”对象都从当前会话中删除,所以当执行下一次刷新时,问题不会出现。
示例流程:
插入赋值实体(多对多的约束,可能只存在一个单一的任务) – >一切正常
插入相同的赋值实体一次 – >一切正常,在这种情况下,控制器返回一些坏的请求异常,在底层Spring抛出IntegrityViolationException – >在测试中一切看起来不错
得到存储库并执行findAll()。size()来检查已经存在的赋值的数量,以确保我们只有一个赋值 – >抛出异常; /发生了什么? 在会话中仍然存在脏对象,通常会话将被销毁(控制器返回错误),但在这里我们有下一个断言来检查数据库,所以这里的解决方案是额外的session.clear()下一个数据库相关的方法执行
示例正确的流程:
插入赋值实体
插入相同的赋值实体
session.clear()
获取存储库并执行findAll()。size()
希望能帮助到你 ;)
你可能正在碰到一些Hibernate的bug。 (我建议至少升级到Hibernate 3.3.2.GA.)
与此同时,当你的ID是空的时,Hibernate会做的更好,这样Hibernate总能分辨出一个新的对象还没有被保存到数据库和已经在数据库中。 将addressID的类型从long更改为Long可能会解决此问题。
您提供的堆栈跟踪显示您看到查询上的问题,因为在执行查询之前,您的查询强制将缓冲写入刷新到数据库,并且写入失败,可能与其他人看到的插入问题相同。
这与正在执行的查询无关。 这只是触发刷新。 在这一点上,Hibernate正试图为实体分配一个标识符,并且由于某种原因似乎失败了。
你可以尝试改变生成器类:
<generator class="identity"/>
看看这是否有所作为。 还有,你确保你已经部署的数据库有正确的自动递增列设置在桌子上?
这听起来像你的问题是类似于这一个 。
好的,我继续研究其他的东西在这个线程的其他答案。 但最后,由于我们在生产截止日期之前,我不得不选择紧急情况。 所以,而不是搞清楚我做了这两件事情:
删除了我正在使用的jQuery库来抓住其中一个窗体的焦点。 我这样做是因为我读了一个地方,这种类型的错误可能会发生,因为一个表单发布空值 – 导致null id的行。 我怀疑jQuery库可能不适合PrimeFaces,并导致某种形式的故障。 只是一种预感。
我杀了用户和地址之间的hibernate实施的关系。 (只需要一个,不是一对多),并在需要时自己写代码。 幸运的是,它只是显着影响了一页,所以没有太多的工作。
底线:我们上线了,应用程序已经运行好几天了,没有任何错误。 所以这个解决方案可能不是很漂亮 – 我并不为自己感到骄傲 – 但我有一个运行的应用程序和一个愉快的客户端。
更改生成器类:
<generator class="identity" />
至
<generator class="assigned" />
org.hibernate.AssertionFailure:条目中的空id(在异常发生后不刷新会话)
这只是发生在我们身上,我想我会为后人增添一些细节。 原来,我们试图创建一个重复的字段违反条件的实体:
Caused by: org.hibernate.exception.ConstraintViolationException: Duplicate entry '' for key 'Index_schools_name'
然而,这个异常被屏蔽,因为即使创建失败,hibernate仍然试图提交会话。 当创建失败,那么ID没有被设置,因此断言错误。 在堆栈跟踪中,我们可以看到hibernate正在提交:
at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit (HibernateTransactionManager.java:480)
它应该已经回滚了会议,而不是承诺。 这原来是我们的回滚配置的一个问题。 我们使用旧的XML配置,异常路径是不正确的:
<prop key="create*">PROPAGATION_required,-org.xyLocalException</prop>
LocalException路径是不正确的,休眠没有抛出一个错误(或被埋在启动日志中)。 如果您使用注释并且不指定正确的异常,则可能也是这种情况:
// NOTE: that the rollbackFor exception should match the throws (or be a subclass) @Transactional(rollbackFor = LocalException.class) public void create(Entity entity) throws AnotherException {
一旦我们修复了我们的hibernate连线,然后我们正确地看到了“重复条目”异常,并且会话正在被回滚和关闭。
另外一个缺点是,当hibernate抛出AssertionFailure ,它在MysqL中持有一个事务锁,然后必须手工处理。 请参阅: https : //stackoverflow.com/a/39397836/179850
我也有同样的例外,在休眠配置文件:
<property name="operateType" type="java.lang.Integer"> <column name="operate_type" not-null="true" /> </property>
当在对象上传递null值时,发生异常
"org.hibernate.AssertionFailure: null id in com.idex.auctions.model.Address entry",
我想这是因为Hibernaye会检查'not-null'属性的原因,所以,删除'not-null'属性或者为'false'设置'not-null'将会解决这个问题。
在catch块中回滚你的事务
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。