如何數據庫表只有一個主鍵,咱們能夠這樣配置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測試經過