hibernate联合主键-XML形式

如何数据库表只有一个主键,我们可以这样配置

1 <hibernate-mapping package="com.study.model">
2 <class name="Student" table="student12"
3     <id name="id" column="id">
4        <generator class="native"></generator>
5     </id>
6     <property name="name" column="name" type="java.lang.String"></property>
7     <property name="age"  column="age" type="java.lang.Integer"></property>
8 </class>
9 </hibernate-mapping>

或者我们用annotation:一般将@id写在get方法上,其实也可卸载field字段上,但是那样的话会破坏pojo原则

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

但是如何我们的数据库表有两个主键该怎么办呢?答案是:compose key联合主键

注意:(1)我们必须用另一个类作为我们的主键类,在第一个pojo中调用这个主键类

          (2)在主键类中,我们必须重写他的equals()和hashcode()方法!

            理由:我们的类都间接或者直接集成自object类,而在object中的equals和hashcode方法如下:

               hashcode介绍:  http://blog.csdn.net/jason_deng/article/details/7074230

1  public boolean equals(Object obj) {
2         return (this == obj);
3     }
4  
5  public native int hashCode();

  既然equals方法只是比较两个类是否“==”,那么,对于主键类就是比较每个字段是否相等。

  hashcode主要是表征对象的唯一性

         (3)主键类还必须实现serializable接口,主要考虑到类的在网络传递,在不同存储介质上转存

下面我们就来写我们自己的联合主键:

1、主键pojo类:

01 public class composeIdPK implements Serializable {
02  private String name;
03  private int id;
04  public String getName() {
05   return name;
06  }
07  public void setName(String name) {
08   this.name = name;
09  }
10  public int getId() {
11   return id;
12  }
13  public void setId(int id) {
14   this.id = id;
15  }
16  @Override
17  public boolean equals(Object o) {
18   composeIdPK pk = null;
19   if (o instanceof composeIdPK)
20    pk = (composeIdPK) o;
21   if (pk.getId() == this.id && pk.getName().equals(this.name))
22    return true;
23   return false;
24  }
25   
26  @Override
27  public int hashCode()
28  {   //重写hashcode方法,放回name的hashcode即可
29   return this.name.hashCode();
30  }
31   
32 }

pojo类

01 package com.study.model;
02 public class composeId {
03   
04  //定义主键是由类承当 
05  private composeIdPK pk;
06  private int uid;
07  private String title;
08  private String address;
09   
10  public int getUid() {
11   return uid;
12  }
13  public void setUid(int uid) {
14   this.uid = uid;
15  }
16  public composeIdPK getPk() {
17   return pk;
18  }
19  public void setPk(composeIdPK pk) {
20   this.pk = pk;
21  }
22  public String getTitle() {
23   return title;
24  }
25  public void setTitle(String title) {
26   this.title = title;
27  }
28  public String getAddress() {
29   return address;
30  }
31  public void setAddress(String address) {
32   this.address = address;
33  }
34   
35 }

配置文件:

01 <hibernate-mapping package="com.study.model">
02 <class name="composeId" table="composeIDTest">
03   //composite—id表明下面是一个联合主键 
04  <composite-id name="pk" class="com.study.model.composeIdPK">
05       <key-property name="id"></key-property>
06       <key-property name="name"></key-property>
07   </composite-id>
08     <property name="title" column="title" type="java.lang.String"></property>
09     <property name="address"  column="address" type="java.lang.String"></property>
10 </class>
11 </hibernate-mapping>

说明:

节点(composite-id)表明是一个联合主键,但是在<class name="composeId" table="composeIDTest">
的束缚下,表明是com.study.model.composeId下的联合主键,并且name=pk必须是和composeId下一致,因为在调用的时候会直接用pk的getter方法调用composeIdPK类从而取得该pojo类的主键

测试类:

01 @Test
02  public  void test() {
03 try {
04   composeIdPK pk=new composeIdPK();
05   pk.setId(1);
06   pk.setName("jackvin");
07   composeId compose=new composeId();
08  compose.setTitle("hah");
09  compose.setAddress("sffds");
10  compose.setPk(pk);
11   //由Configuration拿到SessionFactory再难道session
12 //Configuratin用来读取配置文件 
13  //Configuration cfg=new Configuration();
14 Configuration cfg=new AnnotationConfiguration();
15  
16   cfg.configure();//默认查找classpath下的hibernate.cfg.xml
17 //SessionFactory可以理解为取得connection的 工厂
18   SessionFactory factory=cfg.buildSessionFactory(); 
19 //数据库的一个connection
20   Session session=factory.openSession();
21   session.beginTransaction();
22      session.save(compose);
23      session.getTransaction().commit(); 
24      session.close();
25      factory.close();
26  
27   catch (Exception e) {
28  
29    // TODO: handle exception
30  
31    e.printStackTrace();
32  
33   }
34   fail("Not yet implemented");
35  
36  }

ok测试通过

转:http://my.oschina.net/u/942629/blog/190596

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值