hibernate聯合主鍵

如何數據庫表只有一個主鍵,咱們能夠這樣配置java

<hibernate-mapping package="com.study.model">
<class name="Student" table="student12"> 
    <id name="id" column="id">
       <generator class="native"></generator>
    </id>
    <property name="name" column="name" type="java.lang.String"></property>
    <property name="age"  column="age" type="java.lang.Integer"></property>
</class>
</hibernate-mapping>

或者咱們用annotation:通常將@id寫在get方法上,其實也可卸載field字段上,可是那樣的話會破壞pojo原則數據庫

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY) //指定id的生成策略 
public int getId() {
 return id;
}

可是如何咱們的數據庫表有兩個主鍵該怎麼辦呢?答案是:compose key聯合主鍵網絡

注意:(1)咱們必須用另外一個類做爲咱們的主鍵類,在第一個pojo中調用這個主鍵類session

          (2)在主鍵類中,咱們必須重寫他的equals()和hashcode()方法!app

            理由:咱們的類都間接或者直接集成自object類,而在object中的equals和hashcode方法以下:ide

               hashcode介紹:  http://blog.csdn.net/jason_deng/article/details/7074230測試

 public boolean equals(Object obj) {
        return (this == obj);
    }

 public native int hashCode();

  既然equals方法只是比較兩個類是否「==」,那麼,對於主鍵類就是比較每一個字段是否相等。ui

  hashcode主要是表徵對象的惟一性this

         (3)主鍵類還必須實現serializable接口,主要考慮到類的在網絡傳遞,在不一樣存儲介質上轉存spa

下面咱們就來寫咱們本身的聯合主鍵:

一、主鍵pojo類:

public class composeIdPK implements Serializable {
 private String name;
 private int id;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 @Override
 public boolean equals(Object o) {
  composeIdPK pk = null;
  if (o instanceof composeIdPK)
   pk = (composeIdPK) o;
  if (pk.getId() == this.id && pk.getName().equals(this.name))
   return true;
  return false;
 }
 
 @Override
 public int hashCode()
 {   //重寫hashcode方法,放回name的hashcode便可
  return this.name.hashCode();
 }
 
}

pojo類

package com.study.model;
public class composeId {
 
 //定義主鍵是由類承當 
 private composeIdPK pk;
 private int uid;
 private String title;
 private String address;
 
 public int getUid() {
  return uid;
 }
 public void setUid(int uid) {
  this.uid = uid;
 }
 public composeIdPK getPk() {
  return pk;
 }
 public void setPk(composeIdPK pk) {
  this.pk = pk;
 }
 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public String getAddress() {
  return address;
 }
 public void setAddress(String address) {
  this.address = address;
 }
 
}

配置文件:

<hibernate-mapping package="com.study.model">
<class name="composeId" table="composeIDTest">
  //composite—id代表下面是一個聯合主鍵 
 <composite-id name="pk" class="com.study.model.composeIdPK">
      <key-property name="id"></key-property>
      <key-property name="name"></key-property>
  </composite-id>
    <property name="title" column="title" type="java.lang.String"></property>
    <property name="address"  column="address" type="java.lang.String"></property>
</class>
</hibernate-mapping>

說明:

節點(composite-id)代表是一個聯合主鍵,可是在<class name="composeId" table="composeIDTest">
的束縛下,代表是com.study.model.composeId下的聯合主鍵,而且name=pk必須是和composeId下一致,由於在調用的時候會直接用pk的getter方法調用composeIdPK類從而取得該pojo類的主鍵

測試類:

@Test
 public  void test() {
try {
  composeIdPK pk=new composeIdPK();
  pk.setId(1);
  pk.setName("jackvin");
  composeId compose=new composeId();
 compose.setTitle("hah");
 compose.setAddress("sffds");
 compose.setPk(pk);
  //由Configuration拿到SessionFactory再難道session
//Configuratin用來讀取配置文件 
 //Configuration cfg=new Configuration();
Configuration cfg=new AnnotationConfiguration();

  cfg.configure();//默認查找classpath下的hibernate.cfg.xml
//SessionFactory能夠理解爲取得connection的 工廠
  SessionFactory factory=cfg.buildSessionFactory(); 
//數據庫的一個connection
  Session session=factory.openSession();
  session.beginTransaction();
     session.save(compose);
     session.getTransaction().commit(); 
     session.close();
     factory.close();

  } catch (Exception e) {

   // TODO: handle exception

   e.printStackTrace();

  }
  fail("Not yet implemented");

 }

ok測試經過

相關文章
相關標籤/搜索