Hibernate連合プライマリ・キーの実践
2686 ワード
問題の説明:
1.1つのフィールドがプライマリ・キーとして一意のレコードを識別できない場合は、結合プライマリ・キーとして2つのフィールドが必要です.
2.プロジェクトの設計の時、往々にして性能、複雑度、時間の方面で、取捨選択をして、“連合の主な鍵”の類は比較的に複雑度のものを増加して、特に需要があります.ここでは連合プライマリ・キーの使用方法を学習するだけなので,これらの問題はしばらく考慮しない.
例説明:studentテーブルにsid、sname、sage、sbirthdayなどのフィールドがあると仮定し、sidとsnameをプライマリキーとして一意のレコードを識別することを実現したい.
モデル内のstudentコードは次のとおりです.ここでのStudentPKは、実際には連合プライマリ・キー・フィールドを含むクラスです.
Studio PKコードは以下の通りです.以下の3点に注意してください.
1.シリアル番号インタフェースの実装
書かれたjunitテストクラスで保存データを実行する場合、Serializableインタフェースを実装しないとエラーが表示されます.シーケンス化はjavaが提供するオブジェクト状態を保存するメカニズムであり、オブジェクト状態を簡単に保存してから読み取ることができる.一般的には、次のような状況でシーケンス化が必要です.
a)メモリ内のオブジェクトの状態を1つのファイルまたはデータベースに保存したい場合.
b)ソケットでネットワーク上でオブジェクトを転送したい場合.
c)RMIを介してオブジェクトを転送したい場合.
2.equalsメソッドの書き換え
ここでは判断条件の制限を増やし,sidとsnameがプライマリキーとしてデータの一意性を保証するためである.
3.hashCodeの書き換え方法
テストクラスのコードは次のとおりです.
1.1つのフィールドがプライマリ・キーとして一意のレコードを識別できない場合は、結合プライマリ・キーとして2つのフィールドが必要です.
2.プロジェクトの設計の時、往々にして性能、複雑度、時間の方面で、取捨選択をして、“連合の主な鍵”の類は比較的に複雑度のものを増加して、特に需要があります.ここでは連合プライマリ・キーの使用方法を学習するだけなので,これらの問題はしばらく考慮しない.
例説明:studentテーブルにsid、sname、sage、sbirthdayなどのフィールドがあると仮定し、sidとsnameをプライマリキーとして一意のレコードを識別することを実現したい.
モデル内のstudentコードは次のとおりです.ここでのStudentPKは、実際には連合プライマリ・キー・フィールドを含むクラスです.
package com.zk.model;
public class student {
private StudentPK pk;
public StudentPK getPk() {
return pk;
}
public void setPk(StudentPK pk) {
this.pk = pk;
}
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Studio PKコードは以下の通りです.以下の3点に注意してください.
1.シリアル番号インタフェースの実装
書かれたjunitテストクラスで保存データを実行する場合、Serializableインタフェースを実装しないとエラーが表示されます.シーケンス化はjavaが提供するオブジェクト状態を保存するメカニズムであり、オブジェクト状態を簡単に保存してから読み取ることができる.一般的には、次のような状況でシーケンス化が必要です.
a)メモリ内のオブジェクトの状態を1つのファイルまたはデータベースに保存したい場合.
b)ソケットでネットワーク上でオブジェクトを転送したい場合.
c)RMIを介してオブジェクトを転送したい場合.
2.equalsメソッドの書き換え
ここでは判断条件の制限を増やし,sidとsnameがプライマリキーとしてデータの一意性を保証するためである.
3.hashCodeの書き換え方法
package com.zk.model;
public class StudentPK implements java.io.Serializable {
private int sid;
private String sname;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override // 。
public boolean equals (Object o)
{
if(o instanceof StudentPK)
{
StudentPK pk = (StudentPK)o;
if(this.sid==pk.getSid()&&this.sname.equals(pk.getSname()))
{
return true;
}
return false;
}
return false;
}
@Override
public int hashCode(){
return this.sname.hashCode();
}
}
テストクラスのコードは次のとおりです.
package com.zk.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.zk.model.StudentPK;
import com.zk.model.student;
public class test_001 {
public static void main(String[]args)
{
StudentPK pk = new StudentPK();
pk.setSid(5);
pk.setSname(" ");
student s = new student();
s.setPk(pk);
s.setAge(25);
Configuration cfg = new Configuration();
SessionFactory sf = cfg.configure().buildSessionFactory();// connection ;
Session session = sf.openSession();// connection
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
session.close();
sf.close();
}
}