0

次の基準クエリを使用して、Hibernate でレコードをプルしようとしています。

Security result = (Security) getSession().createCriteria(Security.class)
        .add(  Restrictions.eq("symbol", symbol) ).uniqueResult();

symbol 属性は一意の varchar タイプ (株式シンボル) で、symbol パラメータは String です。

通常、これは問題なく機能しますが、シンボルの名前に「CU」などのハイフンが含まれていると、AssertionFailure Exception が発生します。

私が間違っていること、または回避する方法について何か考えはありますか?


いくつかの背景....

これは、NYSE と NASDAQ からの大量の株式 (証券) の日中の統計 (Yahoo から引き出された株式の現在の価格) を保存している長いトランザクション内で発生します。

これがスローされる時点で、数百の証券がループを通過しています。それらは「保存」されましたが、トランザクションはまだコミットされていません。バッファ(?)がいっぱいになる前にそれを切り落としました。シンボルにハイフンが含まれる証券の場合にのみ、この例外がスローされます。

これが呼び出し引数です....

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)

セキュリティは AbstractSecurity を拡張します.................................

/

**
 * 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;
    }

}
4

1 に答える 1

1

パトリック、エラーは選択ではなく、どこか前にあります。

Hibernate は、更新または作成されたすべてのオブジェクトのリストを保持します。セッションをフラッシュするか、選択などのフラッシュを強制する他の操作を実行すると、すべてのダーティ オブジェクトがデータベースに保存されます。

スタック トレースから、ID なしで IntradayStat の新しいインスタンスを保存/更新したように見えますが、hibernate は ID を期待しています。

于 2012-09-15T07:12:57.300 に答える