andy-j2ee  
JAVA
公告
  • 在夜深人静的时候,偶弹起心爱的土琵琶,唱起那动人的歌谣(柯受良-《大哥》):偶写了代码好多年,偶不爱冰冷的床沿,不要逼偶想念,不要逼偶流泪,偶会翻。
日历
<2011年10月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
统计
  • 随笔 - 19
  • 文章 - 1
  • 评论 - 1
  • 引用 - 0

导航

常用链接

留言簿

随笔分类(5)

随笔档案(19)

文章分类(1)

文章档案(1)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

    

    首先来看一下如何使用JPA标准定义一个Hibernate的POJO对象
 1 package com.anduo.hibernate.model;
 2 
 3 import java.util.Date;
 4 
 5 import javax.persistence.Column;
 6 import javax.persistence.Entity;
 7 import javax.persistence.GeneratedValue;
 8 import javax.persistence.Id;
 9 import javax.persistence.Table;
10 import javax.persistence.Temporal;
11 import javax.persistence.TemporalType;
12 
13 @Entity
14 @Table(name="tb_student")
15 public class Student {
16     private Long id;
17     private String name;
18     private int age;
19     private Date birthday;
20 
21     @Id
22     @GeneratedValue
23     @Column(name="s_id")
24     public Long getId() {
25         return id;
26     }
27 
28     public void setId(Long id) {
29         this.id = id;
30     }
31     @Column(name="s_name")
32     public String getName() {
33         return name;
34     }
35 
36     public void setName(String name) {
37         this.name = name;
38     }
39     
40     @Column(name="s_age")
41     public int getAge() {
42         return age;
43     }
44 
45     public void setAge(int age) {
46         this.age = age;
47     }
48     
49     @Column(name="s_birthday")
50     @Temporal(TemporalType.DATE)
51     public Date getBirthday() {
52         return birthday;
53     }
54 
55     public void setBirthday(Date birthday) {
56         this.birthday = birthday;
57     }
58 
59 }
60 
    可以看到上边的例子中多了几个注解(annotation),其实annotation也是像java类一样的东西,当你写了一个注解的时候,java编译器就会调用注解的方法来帮你做一下事情。如Entity就表示这个类是一个实体,table表示在持久化的时候的表的属性相关联的东西。接下来就是我们的id生成器了。
    在你需要该列是ID的位置写上@Id 那么该列在持久化的时候就会生成为主键。当然这里的主键建议时候包装类型的如Integer Long
    当然我在这里只复习了annotation的持久化,XML的可以参考曹小刚翻译的hibernate文档。
    1        注意:

a)  我们观察hibernate生成表的结构并不是为了将来就用它生成,(可能还有自己的扩展,比如index等)而是为了明白我们应该建立什么样的表和实体类映射

    2    xml生成id

a)         generator

         <id name="id" >

             <generator class="native"></generator>

         </id>

b)         常用四个:native identity sequence uuid

    3        注解方式:@GeneratedValue

a)       自定义ID

b)       AUTO(直接写 @GeneratedValue 相当如native) (@GeneratedValue(strategy=GenerationType.AUTO))

                       i.      默认:对 MySQL,使用auto_increment

                    ii.      Oracle使用hibernate_sequence(名称固定)

c)       IDENTITY(@GeneratedValue(strategy=GenerationType.IDENTITY))

d)       SEQUENCE(@GeneratedValue(strategy=GenerationType.SEQUENCE))

                       i.      @SequenceGenerator(可自定义在数据库生成指定的sequence名)

        @Id

//@GeneratedValue中增加 generator="teacherSEQ"

@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")

//"teacherSEQ"@SequenceGenerator的标识名

//"teacherSEQ_DB"为指定到数据库生成的Sequence

@SequenceGenerator(name="teacherSEQ", sequenceName="teacherSEQ_DB")

public int getId() {

                    return id;

}

e)       TABLE (可以忘记)

                         i.        @TableGenerator

@TableGenerator(

name="teacherID",                     //被调用的TABLE名字

          table="teacherID_DB",                //数据库建立的表名

          pkColumnName="key_value",

          pkColumnValue="pk_value",

          valueColumnName="teacher",             //pkColumnValue对应类名

          allocationSize=1                          //pkColumnValue对应类名

)

 

@GeneratedValue(strategy=GenerationType.TABLE,generator=" teacherID ")

 

       注:如果使用注解方式的uuid 如下:

              @Id

@GeneratedValue(generator="teacherUUID")

@GenericGenerator(name="teacherUUID", strategy="uuid")

    4        FAQ;

a) Junit测试时Hibernate Session Factory初始化异常不提示.疑似一个bug

b) main来做测试

5        联合主键

a) Xml方式: composite-id

                      i.        将联合主键的属性提取出来,重新编写一个pojo类(原pojo类中的id,name要删除 并新加入属性“StudentPK”)

     public class StudentPK implements Serializable {

                   private String id;

                   private String name;

                   … …

                  ii.        新建pojo类必须实现 java.io.Serializable 序列化接

               iii.        新pojo类要重写equals和hashCode方法

@Override

public boolean equals(Object o) {

       if(o instanceof StudentPk) {

              StudentPk pk = (StudentPk)o;

              if(this.id == pk.getId() && this.name.equals(pk.getName())) {

               return true;

              }

       }

       return false;

}

 

@Override

public int hashCode() {

       return this.name.hashCode();

}

                  iv.        联合主键生成策略XML配置方法

       <hibernate-mapping>

                   <class name="com.bjsxt.pojo.Student" >

                            <composite-id name="studentPK" class="com.bjsxt.pojo.StudentPK">

                                     <key-property name="id"></key-property>

                                     <key-property name="name"></key-property>

                            </composite-id>

                            <property name="age" />

                            <property name="sex" />

                            <property name="good" type="yes_no"></property>

                   </class>

</hibernate-mapping>

 

b) Annotation

                      i.        前三步与Xml方式前三步一样 都要建立新pojo类 都要实现Serializable接口 重写equals和hashCode方法.

                  ii.        方法1在新类前写@Embeddable,在原pojo类的新属性“TercherPK”的get方法前写@ld,如下

    @ Embeddable

public class TeacherPK implements Serializable {

                   private String id;

                   private String name;

                   … …

 

             @Entity

public class Teacher {

private TeacherPK teacherPK ;

@Id

public TeacherPK getTeacherPK() {

                            return teacherPK;

}

… …

               iii.        方法2:@EmbeddedlD(*) pojo类无需加注解,只需在原pojo新属性“TercherPK”的get方法前写@EmbeddedlD即可

                     iv.        方法3@Id  @IdClass(*)  pojo类无需加注解,原pojo类的idname属性保留不变,也无需新增“TercherPK”属性。 只在idnameget方法前都加@Id,并在原pojo类前加@IdClass(TeacherPK).class),如下

@Entity

@IdClass(TeacherPK.class)

public class Teacher {

private String id;

private String name;

@Id

public String getId() {

              return id;

}

@Id

public String getName() {

              return name;

}

... ...



posted on 2011-10-07 09:27 安多 阅读(383) 评论(0)  编辑  收藏 所属分类: S2SH Learning

只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © 安多 Powered by: 博客园 模板提供:沪江博客