2

hibernateを使用して簡単なクエリを実行しています。結合はありません。私がやろうとしているのは、テーブルから最大IDを取得することだけです。このサービスは何ヶ月もうまく機能していましたが、突然、過去2週間以内に、指定された識別子を持つ行が存在しないという恐ろしいエラーが発生しました。このテーブルには数百万の行が含まれていますが。これはどのように起こっているのでしょうか?

ルックアップを行うサービスは次のとおりです。

try {
    session = HibernateUtils.beginTransaction("mydatabase");
    criteria = session.createCriteria(MyClass.class);
    criteria.setMaxResults(1);
    Order order = Order.desc("id");
    criteria.addOrder(order);
    myclass = (MyClass) criteria.uniqueResult();
    } catch (HibernateException e_) {
        e_.printStackTrace();
        String msg = "Problem getting maximum id from myclass table "
            +  e_.getCause();
    LOG.error(msg);
    throw new DataBaseAccessException(msg);
    }finally {
        try {
            HibernateUtils.closeSessions();
        } catch (Exception e_) {
        }
    }
4

1 に答える 1

2

結合のない単一のテーブルでクエリを実行している場合でも、クエリに含まれる基になるモデルも確認することが重要です。そのモデルに結合列があり、関連する外部キーが結合テーブルに存在しない場合、Hibernateは失敗します。

この場合、基礎となるモデルは次のとおりです。別のテーブルcode_tableにマップする結合列cidがあります。しかし、icdtableでクエリされている値を持つcode_tableに対応するエントリがありませんでした。クエリはicdtableのみにありましたが、基になるモデルが別のテーブルと結合するという事実は、クエリが実行されているテーブルだけでなく、テーブル全体でデータの整合性が存在することを必要とします。

@Entity
@Table (name="icdtable", catalog="emscribedx")
public class Icdtable {
private Long _icdid;
private Long _cid;
private String _icdcode; //TODO: add this to hibernate mappings ('PN' or 'NN')
private String _status;
private String _create_date;
private String _kstatus;
private int _enterorder;
private String _poa;
private String _ppoa;
private String _userid;
private Code_table _code_table1;
private List<Proceduredetail> _proceduredetails;

@Id
@Column (name = "icdid")
public Long getIcdid() {
    return _icdid;
}
public void setIcdid(Long icdid_) {
    _icdid = icdid_;
}

@Column (name = "cid")
public Long getCid() {
    return _cid;
}
public void setCid(Long cid_) {
    _cid = cid_;
}

@Column (name = "icdcode")
public String getIcdcode() {
    return _icdcode;
}
public void setIcdcode(String icdcode_) {
    _icdcode = icdcode_;
}

@Column (name = "status")
public String getStatus() {
    return _status;
}
public void setStatus(String status_) {
    _status = status_;
}

@Column (name = "create_date")
public String getCreate_date() {
    return _create_date;
}
public void setCreate_date(String createDate_) {
    _create_date = createDate_;
}

@Column (name = "kstatus")
public String getKstatus() {
    return _kstatus;
}
public void setKstatus(String kstatus_) {
    _kstatus = kstatus_;
}

@Column (name = "enterorder")
public int getEnterorder() {
    return _enterorder;
}
public void setEnterorder(int enterorder_) {
    _enterorder = enterorder_;
}

@Column (name = "poa")
public String getPoa() {
    return _poa;
}
public void setPoa(String poa_) {
    _poa = poa_;
}

@Column (name = "ppoa")
public String getPpoa() {
    return _ppoa;
}
public void setPpoa(String ppoa_) {
    _ppoa = ppoa_;
}

@Column (name = "userid")
public String getUserid() {
    return _userid;
}
public void setUserid(String userid_) {
    _userid = userid_;
}

@ManyToOne
@JoinColumn(name = "cid", insertable=false, updatable=false)
public Code_table getCode_table() {
    return _code_table1;
}
public void setCode_table(Code_table code_table_) {
    _code_table1 = code_table_;
}

@OneToMany (mappedBy = "icdtable", targetEntity = Proceduredetail.class, cascade =  CascadeType.ALL)
public List<Proceduredetail> getProceduredetails() {
    return _proceduredetails;
}
public void setProceduredetails(List<Proceduredetail> proceduredetails_) {
    _proceduredetails = proceduredetails_;
}
于 2012-04-04T02:05:13.447 に答える