2012-04-03 14 views
2

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

は、ルックアップを行うサービスです。

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_) { 
     } 
    } 

答えて

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_; 
} 
+0

したがって、Hibernateはとにかく結合を実行していますか?それはなぜそれを行うのだろう、私はそれがパフォーマンスを低下させることを期待しているので、私はそれを望んでいない。暗黙的な結合を実行しないようにするにはどうすればよいですか? – Jonah

+0

レイジーローディングは私にはその質問の答えがあるようです – kenny

関連する問題