Hibernate 带连字符的字符串的休眠限制引发assertionfailure异常
我正在尝试使用以下查询条件在Hibernate中提取记录Hibernate 带连字符的字符串的休眠限制引发assertionfailure异常,hibernate,restrictions,Hibernate,Restrictions,我正在尝试使用以下查询条件在Hibernate中提取记录 Security result = (Security) getSession().createCriteria(Security.class) .add( Restrictions.eq("symbol", symbol) ).uniqueResult(); symbol属性是唯一的varchar类型(股票符号),symbol参数是字符串 通常情况下,这很好,但每当符号的名称中包含连字符(如“C-U”)时,就会出现A
Security result = (Security) getSession().createCriteria(Security.class)
.add( Restrictions.eq("symbol", symbol) ).uniqueResult();
symbol属性是唯一的varchar类型(股票符号),symbol参数是字符串
通常情况下,这很好,但每当符号的名称中包含连字符(如“C-U”)时,就会出现AssertionFailure异常
你知道我做错了什么,或者怎么解决吗
一些背景 这发生在一次长时间交易中,我正在存储纽约证券交易所(NYSE)和纳斯达克(NASDAQ)大量股票的日内统计数据(雅虎股票的当前价格) 到这个时候,已经有几百种证券通过了这个循环。它们已“保存”,但事务尚未提交。我在缓冲区(?)满之前就把它切断了。只有当涉及到符号中带有连字符的安全性时,才会引发此异常 这是主叫论点
security = securityDAO.findBySymbol(record[0]);
SecurityDAO中的完整方法
public Security findBySymbol(String symbol){
log.debug("finding Security by symbol");
try{
Security result =
(Security) getSession().createCriteria(Security.class)
.add( Restrictions.eq("symbol", symbol)).uniqueResult();
if (result == null)
return null;
return result;
} catch (RuntimeException re) {
log.error("Failed to find security by symbol.", re);
throw re;
}
}
引发异常
org.hibernate.AssertionFailure: null id in com.securityscanner.hibernate.IntradayStat entry (don't flush the Session after an exception occurs)
at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:78)
at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:187)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:143)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:997)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1590)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:328)
at com.securityscanner.hibernate.SecurityDAO.findBySymbol(SecurityDAO.java:187)
at com.securityscanner.ScanStatsTask.storeCurrentStats(ScanStatsTask.java:196)
at com.securityscanner.ScanStatsTask.run(ScanStatsTask.java:99)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
安全性扩展了抽象安全性
/
帕特里克,错误不在选择中,而是在之前的某个地方 Hibernate保留所有更新或创建的对象的列表,当您刷新会话或执行强制刷新的任何其他操作(如选择)时,它会将所有脏对象保存到数据库中
从堆栈跟踪中,您似乎已保存/更新了一个没有id的IntradayStat的新实例,hibernate需要一个。请发布堆栈跟踪以及安全类的代码Sure。。。我会在原来的帖子上加上…是的,当我回顾过去的时候,我也有同样的怀疑。我会调查一下,然后再报告。谢谢你的帮助!=)是的。看起来事情就是这样。有一些无效的时间戳通过,恰好与带连字符的证券一致。刷新它们时,DB拒绝插入它们并分配ID。我加强了验证和事务处理,现在运行已成功完成。再次感谢!
**
* AbstractSecurity entity provides the base persistence definition of the
* Security entity. @author MyEclipse Persistence Tools
*/
public abstract class AbstractSecurity implements java.io.Serializable {
// Fields
private Integer securityId;
private Exchange exchange;
private String name;
private String symbol;
private String securityType;
private String description;
private Boolean skip;
private Set dailyStats = new HashSet(0);
private Set intradayStats = new HashSet(0);
// Constructors
/** default constructor */
public AbstractSecurity() {
}
/** full constructor */
public AbstractSecurity(Exchange exchange, String name, String symbol,
String securityType, String description, Boolean skip,
Set dailyStats, Set intradayStats) {
this.exchange = exchange;
this.name = name;
this.symbol = symbol;
this.securityType = securityType;
this.description = description;
this.skip = skip;
this.dailyStats = dailyStats;
this.intradayStats = intradayStats;
}
// Property accessors
public Integer getSecurityId() {
return this.securityId;
}
public void setSecurityId(Integer securityId) {
this.securityId = securityId;
}
public Exchange getExchange() {
return this.exchange;
}
public void setExchange(Exchange exchange) {
this.exchange = exchange;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getSymbol() {
return this.symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public String getSecurityType() {
return this.securityType;
}
public void setSecurityType(String securityType) {
this.securityType = securityType;
}
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
public Boolean getSkip() {
return this.skip;
}
public void setSkip(Boolean skip) {
this.skip = skip;
}
public Set getDailyStats() {
return this.dailyStats;
}
public void setDailyStats(Set dailyStats) {
this.dailyStats = dailyStats;
}
public Set getIntradayStats() {
return this.intradayStats;
}
public void setIntradayStats(Set intradayStats) {
this.intradayStats = intradayStats;
}
}