Hibernate3.x总结

一、*.hbm.xml操作:
Hibernate连接固定格式:
1.找到hibernate配置(hibernate.cfg.xml);配置文件必须放在src文件下
    Configuration config=new Configuration().configure();-----import org.hibernate.cfg.Configuration;
2.从配置中取出SessionFactory;
    SessionFactory factory=config.buildSessionFactory();----import org.hibernate.SessionFactory;
3.从SessionFactory中取出一个Session;
    Session session=factory.openSession();-----import org.hibernate.Session;

************************************************************
------------------------------------------------------------所有的操作都是通过session进行的
************************************************************
    // 向数据库中增加数据
    public void insert(Person p)
    {
        // 开始事务
        Transaction tran = this.session.beginTransaction() ;--------import org.hibernate.Transaction;
        // 执行语句
        this.session.save(p) ;
        // 提交事务
        tran.commit() ;
        // 关闭Session
        this.session.close() ;
    }
    // 在Hibernate 3之中根据HQL中的语句进行了修改,增加了删除指令
    public void delete(String id)
    {
        String hql = "DELETE Person WHERE id=?" ;
        Query q = this.session.createQuery(hql) ;
        // 把参数设置
        q.setString(0,id) ;
        // 执行更新语句
        q.executeUpdate() ;
        // 进行事务处理
        this.session.beginTransaction().commit() ;
    }
    // 修改
    public void update(Person p)
    {
        // 开始事务
        Transaction tran = this.session.beginTransaction() ;
        // 执行语句
        this.session.update(p) ;
        // 提交事务
        tran.commit() ;
    }    
    // 按ID查询:推荐使用HQL —— 是Hibernate官方推荐的查询语言
    public Person queryById(String id)
    {
        Person p = null ;
        // 使用Hibernate查询语言
        String hql = "FROM Person as p WHERE p.id=?" ;
        // 通过Query接口查询
        Query q = this.session.createQuery(hql) ;
        q.setString(0,id) ;
        List l = q.list() ;
        Iterator iter = l.iterator() ;
        if(iter.hasNext())
        {
            p = (Person)iter.next() ;
        }
        return p ;
    }
    
    // 查询全部数据,写HQL
    public List queryAll()
    {
        List l = null ;
        String hql = "FROM Person as p" ;
        Query q = this.session.createQuery(hql) ;
        l = q.list() ;
        return l ;
    }
    
    // 模糊查询
    public List queryByLike(String cond)
    {
        List l = null ;
        String hql = "FROM Person as p WHERE p.name like ?" ;
        Query q = this.session.createQuery(hql) ;
        q.setString(0,"%"+cond+"%") ;
        l = q.list() ;
        return l ;
    }


*****************************************

Hibernate数据检索语言:
一、Criteria  Query用法:Person为与表匹配的pojo类
    Criteria  criteria=session.createCriteria(Person.class);
    criteria.add(Expression.eq("key",value));
    这句话也就等于:select * from person where key='value';
    List list=criteria.list();

    其中:Expression的方法有:key为表person的字段名,value是key对应的值
    Expression.eq("key",value)-->key=value的所有记录
    Expression.gt("key",value)-->key>value的所有记录    Expression.ge("key",value)-->key>=value的所有记录
    Expression.lt("key",value)-->key<value的所有记录    Expression.le("key",value)-->key<=value的所有记录
    Expression.between("key",value1,value2)-->key在[value1,value2]范围的所有记录
    Expression.like("key","%value%")-->key的值中带有value的所有记录
     重点:in用法:
    1.collection集合类
    Collection  col=new TreeSet();
    col.add(...);
    col.add(...);
    Expression.in("key",col)-->key的值含有col的所有记录
    2.数组:
    String[] str={"",""};
    Expression.in("key",str)-->key的值含有str的所有记录
    Expression的and和or操作,都是连接两个条件的,and表示"且",or表示"或"


二、Query的分页操作:
    pages(总页数),currentPage(当前页),records(总记录数),pageSize(每页显示的记录数)
    总页数:pages= (records+pageSize-1)/pageSize;  
    Query的setFirstResult((currentPage-1)*pageSize);从开始
    Query的SetMaxResults(pageSize);每页显示数
    List list=q.list();

************************************************************
    创建表:
        create table person(
        id int not null,
        name varchar2(20) not null,
        password varchar2(20) not null,
        primary key(id,name)
        );
实现复合主键,满足要求:pakage:com.hisu.bean
    1.创建pojo类Person和复合主键类PersonPK,且必须实现Serializable接口;

    public class Person implements Serializable{
        private PersonPK personPK;
        private String password;
        
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public PersonPK getPersonPK() {
            return id;
        }
        public void setPersonPK(PersonPK personPK) {
            this.personPK = personPK;
        }
    }

    public class PersonPK implements Serializable{
        private int id;
        private String name;
        
        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;
        }
    }
    

    2.复合主键类PersonPK复写equals和hashCode方法
        对应equals和hashCode方法的复写,可以借助第三方工具commons-lang-1.0.1.jar
    equals方法:
        public boolean equals(Object arg0) {
        if(this==arg0){
            return true;
        }
        if (!(arg0 instanceof PersonPK)) {
            return false;
        }
        PersonPK p=(PersonPK)arg0;
        return new EqualsBuilder().append(this.id,p.id).append(this.name,p.name).isEquals();
        }

    hashCode方法:
        public int hashCode() {
            return new HashCodeBuilder().append(this.id).append(this.name).toHashCode();
        }

    3.创建表person的映射文件Person.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.hisu.beans.Person" table="person">
        <composite-id name="personPK" class="com.hisu.beans.PersonPK">
            <key-property name="id" type="java.lang.Integer">
                <column name="id" />
            </key-property>
            <key-property name="name" type="java.lang.String">
                <column name="name" length="36" />
            </key-property>
        </composite-id>
    <property name="password" type="java.lang.String">
            <column name="password" length="20" not-null="true" />
        </property> 
    </class>
</hibernate-mapping>

    注:
           可以通过表映射文件直接生成:勾上"Java Data Object(POJO <> DB Table)"即可

    4.表操作

    1>.insert/delete/update:
        Person person = new Person();
        PersonPK personPK = new PersonPK();
        personPK.setId(1);
        personPK.setName("duanwei");
        person.setPersonPK(personPK);
        person.setPassword("123");
        this.getHibernateTemplate().save(person);-------insert    
        this.getHibernateTemplate().delete(person);-------delete
        this.getHibernateTemplate().update(person);-------update

    2>.select:(根据复合主键的一个键(id)查询Person的另一个复合主键(name))

    public List<String> select(int id) throws SQLException{
        String hql = "select p.personPK.id from Person as p where p.personPK.id=?"
        Session session = this.getSession(true);
        Query q = session.createQuery(hql);
        q.setInteger(0, id);
        List<String> result = (List<String>)q.list();
        this.releaseSession(session);
        return result;
    }    

***********************************************************
组合映射:
    create table person(
    id number primary key,
    firstname varchar2(20),
    lastname varchar2(50),
    address varchar2(50),
    zipcode varchar2(6),
    tel varchar2(50)
    );

1.提取表person中的firstname,lastname字段组成Name类(pojo),address,zipcode和tel字段组成Contact类(pojo);

public class Name {
    private String firstname ;
    private String lastname ;
    public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
    public String getLastname() {
        return lastname;
    }
    public void setLastname(String lastname) {
        this.lastname = lastname;
    }
}

public class Contact {
    private String address ;
    private String zipcode ;
    private String tel ;
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getZipcode() {
        return zipcode;
    }
    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }
}


2.建Person表的pojo类Person,把Name,Contact作为Person类的属性;

public class Person {
    private int id ;
    private Name name ;
    private Contact contact ;
    public Contact getContact() {
        return contact;
    }
    public void setContact(Contact contact) {
        this.contact = contact;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public Name getName() {
        return name;
    }
    public void setName(Name name) {
        this.name = name;
    }
}

3.在Person.hbm.xml中使用<component>标签,方法是:右键class/Add Child/any-many-to-one/component
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="org.lxh.hibernate">

    <class name="Person" table="PERSON">
        <id name="id" column="ID" type="int">
            <generator class="assigned" />
        </id>
        <component name="name" class="org.lxh.hibernate.Name">
            <property name="firstname" column="FIRSTNAME" type="string" not-null="true" />
            <property name="lastname" column="LASTNAME" type="string" not-null="true" />
        </component>
        <component name="contact" class="org.lxh.hibernate.Contact">
            <property name="address" column="ADDRESS" type="string" not-null="true" />
            <property name="zipcode" column="ZIPCODE" type="string" not-null="true" />
            <property name="tel" column="TEL" type="string" />
        </component>
    </class>

</hibernate-mapping>

4.表操作:(和普通表操作一样)

*********************************************************************
实体层设计:                        有两张表
        TBOOK表                            TDVD表
    create table tbook(                    create table tdvd(
    id number primary key,                    id number primary key,
    name vachar2(50),                    name vachar2(50),
    manufacturer vachar2(50),                manufacturer vachar2(50),
    pagecount number                    regincode varchar2(30)
    )                            )
    注意:此种设计需要有两个*.hbm.xml文件。

设想1:由于两个表之间具有共同的字段和类型(id,name,manufacturer),可以考虑将共同的字段和类型映射成父表,而在子表TBOOK和TDVD中设计自己的主键id和特有的字段,子表和父表通过关系型数据库的外键相连。
        父表TITEM                子表TBOOK                子表TDVD
    create table titem(            create table tbook(            create table tdvd(
    id number primary key,            id number primary key,            id number primary key,
    name vachar2(50) not null,        pagecount number            regincode varchar2(30)
    manufacturer vachar2(50) not null    )                    )
    )

***************好处:此种设计只需要一个*.hbm.xml文件(Titem.hbm.xml).

1.建立父类TItem(pojo);

2.建立子类TBook(pojo)和子类TDvd(pojo),继承父类TItem;

3.在Titem.hbm.xml中添加<joined-subclass>标签,方法:右键class/Add Child/joined-subclass

<hibernate-mapping>
    <class name="com.sun.key02.Titem" table="TITEM" schema="SCOTT">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="22" scale="0" />
            <generator class="assigned"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="50" />
        </property>
        <property name="manufacturer" type="java.lang.String">
            <column name="MANUFACTURER" length="50" />
        </property>
        <joined-subclass name="com.sun.key02.Tbook" table="TBOOK">
            <key column="ID"></key>
            <property name="pagecount" type="java.lang.Long">
                <column name="PAGECOUNT"></column></property>
        </joined-subclass>
        <joined-subclass name="com.sun.key02.Tdvd" table="TDVD">
            <key column="ID"></key>
            <property name="regincode" type="java.lang.String">
                <column name="REGINCODE"></column></property>
        </joined-subclass>
    </class>
</hibernate-mapping>
------------------------------------------------------------------------------
设想2.在实际开发中,通过冗余字段表达同类型数据可能是用户在绝大多数情况下的选择。
      通过建立一张表titem存放表tbook和表tdvd的所有字段。
        父表TITEM                子表TBOOK                子表TDVD
    create table titem(            create table tbook(            create table tdvd(
    id number primary key,            id number primary key,            id number primary key,
    name vachar2(50) not null,        pagecount number            regincode varchar2(30)
    manufacturer vachar2(50) not null,    )                    )
    category varchar2(10) not null,
    pagecount number,
    regincode varchar2(30)
    )
其中:category=1,代表商品类型为书籍(tbook);
      category=2,代表商品类型为dvd;

1.建立父类TItem(pojo),只含有id,name,manufacturer的公共字段;

2.建立子类TBook(pojo)和子类TDvd(pojo),继承父类TItem;

3.在Titem.hbm.xml中添加<discriminator>和<subclass>标签;
<hibernate-mapping>
    <class name="com.sun.key03.Titem" table="TITEM" schema="SCOTT">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="22" scale="0" />
            <generator class="assigned"></generator>
        </id>
        <discriminator column="CATEGORY" type="java.lang.String"></discriminator>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="50" not-null="true" />
        </property>
        <property name="manufacturer" type="java.lang.String">
            <column name="MANUFACTURER" length="50" not-null="true" />
        </property>
        <subclass discriminator-value="1" name="com.sun.key03.Tbook">
        <property name="pagecount" type="java.lang.Long">
            <column name="PAGECOUNT" precision="22" scale="0" />
        </property>
        </subclass>
        <subclass name="com.sun.key03.Tdvd" discriminator-value="2">
        <property name="regincode" type="java.lang.String">
            <column name="REGINCODE" length="30" />
        </property>
        </subclass>
    </class>
</hibernate-mapping>

                
***************切记:在TableDAOImpl.java中对象为父类;

hibernate容器三种映射:(key中的column表示既是主键又是外键的那个列名)

Set容器:(一个人可以有多个email地址,但是这多个email地址不能重复)

        表Person                        表Emails
    create table person(                    create table emails(
     id int auto_increment primary key,            id int,
    name varchar(20)                    address varchar(20)    ,
    )                            )foreign key(id) references person(id) on delete cascade)

   1.建立Person表的pojo类,在类中添加Set来包含表Emails的pojo;
    private Set emails;

   2.在生成的person.hbm.xml中添加如下内容;
    <set name="emails" table="emails">--------name为表Emails在Person(pojo)中的Set变量;
            <key column="id"></key>-----------外键关联
            <element type="java.lang.String" column="address"></element>
        </set>
   注意:1.在hibernate中进行级联删除时,最好加入FOREIGN KEY,用HQL根据id删除,"on delete cascade"
     2.在给表Emails设置值是,通过p.setEmails(new TreeSet());//p.getEmails().add(object);

            


List容器:(一个人可以有多个书,但是这多个书可以相同)
    但是这种相同的书可能'新旧'会有所不同,必须有个区分点"position(int)"

        表Person                        表Books
    create table person(                    create table books(
     id int auto_increment primary key,            id int,
    name varchar(20)                    posit int,--------------主观增加此列,进行区分
    )                            title varchar(20),
                                foreign key(id) references person(id) on delete cascade)       
   1.建立Person表的pojo类,在类中添加List来包含表Books的pojo;
    private List books;


   2.在生成的person.hbm.xml中添加如下内容:
    <list name="books" table="books">
        <key column="id"></key>
        <index column="posit"></index>
        <element type="java.lang.String" column="title"></element>
    </list>
    


总结:不管是Set还是List,实际上都不能重复的;
      Set相当于有程序自行处理,而List相当于给表增加一个索引列,此字段由hibernate自行控制


Map容器:(一个人可能有一个电话本,电话本保存了多个电话)
    电话:--->(姓名,电话号码)---->Map
        表Person                        表Phone
    create table person(                    create table phone(
     id int auto_increment primary key,            id int,
    name varchar(20)                    name varchar(20),
    )                            num varchar(30),
                                foreign key(id) references person(id) on delete cascade)

   1.建立Person表的pojo类,在类中添加Map来包含表Phone的pojo;
    private Map phone;


   2.在生成的person.hbm.xml中添加如下内容:
    <Map name="phone" table="phone">
        <key column="id"></key>
        <index type="java.lang.String" column="name"></index>
        <element type="java.lang.String" column="num"></element>
    </Map>
    注意:在给表Phone中设置值时方法为:p.setPhone(new HashMap());//p.getPhone().add(key,value);

一、1对1关联:

   1->.主键关联:
            表Person                    表IdCard
        create table Person(                create table Idcard(
        id varchar(32) primary key,            id varchar(32) references Person(id),
        name varchar(32)                 num varchar(18)
        )                        )on delete cascade
    
    1.建立类Person(pojo)和类Idcard(pojo),在Person中加属性Idcard;在Idcard中加属性Person;

    2.建立Person.hbm.xml和Idcard.hbm.xml文件;
    Person.hbm.xml:
<hibernate-mapping>
    <class name="com.sun.pojo01.Person" table="person" >
        <id name="id" type="java.lang.String">
            <column name="id" length="32" />
            <generator class="uuid.hex"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="20" />
        </property>
        <one-to-one name="idCard" class="com.sun.pojo01.Idcard" 
            outer-join="true" cascade="all">--------------------------------不能少
        </one-to-one>
    </class>
</hibernate-mapping>

    Idcard.hbm.xml:
<hibernate-mapping>
    <class name="com.sun.pojo01.Idcard" table="idcard">
       <id name="id" column="id" type="java.lang.String">
           <generator class="foreign">---------------------------------------------------表示外键关联
               <param name="property">person</param>---------------------------------要参考的表类名
           </generator>
       </id>
       <one-to-one name="person" class="com.sun.pojo01.Person" 
                constrained="true">--------------------------不能少
       </one-to-one> 
        <property name="num" type="java.lang.String">
            <column name="num" length="18" />
        </property>
    </class>
</hibernate-mapping>

    3.执行时,Person类和Idcard类都要实例化,并且都要实现值设定;

   2->.唯一外键关联:(多对一)多个人可以组成一个组
            表Person                    表Tgroup
        create table Person(                create table Tgroup(
        id varchar(32) primary key,            gid varchar(32) primary key,
        name varchar(20) not null,            name varchar(20)
        age int ,                    )
        gid varchar(32)
        )
    1.建立类Person(pojo)和类Tgroup(pojo),在Person中加属性Tgroup;在Tgroup中加属性Person;
        Person(pojo)中不实现gid;
    2.建立Person.hbm.xml和Tgroup.hbm.xml文件;

    Person.hbm.xml
<hibernate-mapping>
    <class name="com.sun.pojo02.Person" table="person">
        <id name="id" type="java.lang.String">
            <column name="id" length="32" />
            <generator class="uuid.hex"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="20" not-null="true" />
        </property>
        <property name="age" type="java.lang.Integer">
            <column name="age" />
        </property>
        <many-to-one name="tgroup" class="com.sun.pojo02.Tgroup" column="gid" unique="true"></many-to-one>
    </class>
</hibernate-mapping>

    Tgroup.hbm.xml
<hibernate-mapping>
    <class name="com.sun.pojo02.Tgroup" table="tgroup">
        <id name="gid" type="java.lang.String">
            <column name="gid" length="20" />
            <generator class="uuid.hex"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="20" />
        </property>
        <one-to-one name="person" class="com.sun.pojo02.Person" property-ref="tgroup"></one-to-one>
    </class>
</hibernate-mapping>

    3.执行时,Person类和Tgroup类都要实例化,而且必须是先插入Tgroup,后插入Person.

******************lazy=false,子表的信息会同主表信息同时加载,一般只有完全用到子表信息的时候,才会lazy=false,但是关联键会传过去


二、1对多关联:一个人可以有多个地址

            表Person                    表Address
        create table Person(                create table Address(
        pid varchar(32) primary key,            aid varchar(32) primary key,
        pname varchar(20) not null,            aname varchar(20) not null,
        age int,                    zipcode varchar(10) not null,
        );                        pid varchar(32),
                                foreign key(pid) references Person(pid) on delete cascade);

    1.建立类Person(pojo)和类Address(pojo),在Person中加属性Set类型的Address;在Address中加属性Person;
        用Set表示多个不同的地址;在Address中不能有pid
    2.建立Person.hbm.xml和Address.hbm.xml文件;
    
    Person.hbm.xml

<hibernate-mapping>
    <class name="com.sun.pojo03.Person" table="person" catalog="oracle">
        <id name="pid" type="java.lang.String">
            <column name="pid" length="32" />
            <generator class="uuid.hex"></generator>
        </id>
        <property name="pname" type="java.lang.String">
            <column name="pname" length="20" not-null="true" />
        </property>
        <property name="age" type="java.lang.Integer">
            <column name="age" />
        </property>
        <set name="addresses" table="address" 
                inverse="true" lazy="false" cascade="all">-----------------------不能少
            <key>
                <column name="pid" length="10" />-------------------------------对自关联而言,此列为父Id
            </key>
            <one-to-many class="com.sun.pojo03.Address" />
        </set>
    </class>
</hibernate-mapping>

    Address.hbm.xml

<hibernate-mapping>
    <class name="com.sun.pojo03.Address" table="address" catalog="oracle">
        <id name="aid" type="java.lang.String">
            <column name="aid" length="32" />
            <generator class="uuid.hex"></generator>
        </id>
        <many-to-one name="person" class="com.sun.pojo03.Person" fetch="select">
            <column name="pid" length="10" />
        </many-to-one>
        <property name="aname" type="java.lang.String">
            <column name="aname" length="20" not-null="true" />
        </property>
        <property name="zipcode" type="java.lang.String">
            <column name="zipcode" length="20" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

    3.执行时,Person类和Address类都要实例化,并且都要实现值设定;


三、多对多(必须通过中间表)

        表Person                表Person_Server                表Server
    create table person(            create table person_server(        create table server(
    pid varchar(32) primary key,        pid varchar(32),            sid varchar(32) primary key,
    pname varchar(20) not null        sid varchar(32)                sname varchar(20) not null
    )                    )                    )

    1.建立Person(pojo)和Server(pojo)类,并且增加Set类型的Person和Server;

    2.建立Person.hbm.xml和Server.hbm.xml文件:

    Person.hbm.xml

<hibernate-mapping>
    <class name="com.sun.pojo04.Person" table="person">
        <id name="pid" type="java.lang.String">
            <column name="pid" length="32" />
            <generator class="uuid.hex"></generator>
        </id>
        <property name="pname" type="java.lang.String">
            <column name="pname" length="20" not-null="true" />
        </property>
        <set name="servers" table="person_server" cascade="all">
            <key>
                <column name="pid"></column>
            </key>
            <many-to-many column="sid" class="com.sun.pojo04.Server">
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>

    Server.hbm.xml

<hibernate-mapping>
    <class name="com.sun.pojo04.Server" table="server">
        <id name="sid" type="java.lang.String">
            <column name="sid" length="32" />
            <generator class="uuid.hex"></generator>
        </id>
        <property name="sname" type="java.lang.String">
            <column name="sname" length="20" not-null="true" />
        </property>
        <set name="persons" table="person_server" cascade="all">
            <key>
                <column name="sid"></column>
            </key>
            <many-to-many column="pid" class="com.sun.pojo04.Person">
            </many-to-many>
        </set>  
    </class>
</hibernate-mapping>

    
二、annotation操作:

1.src下的hibernate.cfg.xml中配置<mapping class="bean"/>

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">
            org.gjt.mm.mysql.Driver
        </property>
        <property name="hibernate.connection.url">
            jdbc:mysql://localhost:3306/hibernate
        </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="hibernate.hbm2ddl.auto">create</property>-----可以为update,但是此行必须有
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <!--
        <mapping class="com.hisu.bean.Wife" />
        <mapping class="com.hisu.bean.Husband" />
        <mapping resource="com.hisu.bean.Media_info.hbm.xml"/>
         -->
        <mapping class="com.hisu.bean.Person"/>
    </session-factory>
</hibernate-configuration>


2.测试步骤:
    Configuration cfg = new AnnotationConfiguration();
    SessionFactory sf = cfg.configure().buildSessionFactory();
    Session session = sf.openSession();
    session.beginTransaction();
    ...
    session.beginTransaction().commit();
    session.close();

3.annotation的基本配置:在bean中的class上面@Entity,在主键的get方法上面@id

  1>.忽略某一个字段内容:@Transient

  2>.映射日期与时间类型,指定时间精度:(bean中的类型为:java.util.Date)
    
    a>.默认的数据库类型为:datetime------2010-08-04 14:57:42

    b>.制定精度:@Temporal(TemporalType.TIME)

  3>.ID生成策略:@GeneratedValue(strategy=GenerationType.A),A=(AUTO,IDENTITY,SEQUENCE,TABLE)

    a>.默认(AUTO):mysql为auto_increment,oracle为sequence(命名固定为:hibernate_sequence)

    b>.IDENTITY:mysql中可用,为auto_increment

    c>.SEQUENCE:oracle中使用,为sequence
        
        若要改hibernate_sequence,需要在类上加@sequenceGenerator(name="标识名",sequenceName="新序列名")
        在ID方法上:@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="标识名")

    d>.TABLE:

    e>.uuid生成:

@Entity
public class Person {
    private String id;
    private String name;
    
    @Id
    @GeneratedValue(generator="persontableGenerator")
    @GenericGenerator(name="persontableGenerator",strategy="uuid")
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

    f>.联合主键:必须实现联合组建类并重写equal和hashcode方法,实现Serializable

        1>.将组建类注解为@Embeddable,并将组建的属性注解为@Id;
eg:

@Entity
public class Student {
    private StudentPK studentPK;
    private String sex;
    private String password;
    private Date birthday;
    
    
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    @Temporal(TemporalType.TIME)
    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Id
===================================此为组建的属性================================
    public StudentPK getStudentPK() {
        return studentPK;
    }
    public void setStudentPK(StudentPK studentPK) {
        this.studentPK = studentPK;
    }
    
}

@Embeddable
public class StudentPK implements Serializable {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

        2>.将组建的属性注解为@EmbeddedId;

        3>.将类注解为@IdClass(StudentPK.class),并将该实体中所有属于主键的属性注解为@Id;


  4>.一对一关联:

eg:一夫一妻制

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class Husband {
    private int id;
    private String name;
    private Wife wife;
    @OneToOne
//    @JoinColumn(name="wifeId")
    public Wife getWife() {
        return wife;
    }
    public void setWife(Wife wife) {
        this.wife = wife;
    }
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class Wife {
    private int id;
    private String name;
    private Husband husband;
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @OneToOne(mappedBy="wife")
    public Husband getHusband() {
        return husband;
    }
    public void setHusband(Husband husband) {
        this.husband = husband;
    }
}


  5>.组合映射

eg:

public class Address {
    private String url;
    private String telephone;
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getTelephone() {
        return telephone;
    }
    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }
}

import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    private int id;
    private String name;
    private Address address;
    
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Embedded
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }

}


  6>.一对多


eg:

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

@Entity
public class Teacher {
    private int id;
    private String name;
    private String sex;
    private Set<Student> students = new HashSet<Student>();
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @OneToMany
    @JoinColumn(name="teacherId")--------必须添加此项
    public Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }

}


import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Student {
    private int id;
    private String name;
    private String sex;
    private String password;
    private Date birthday;
    
    
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    @Temporal(TemporalType.TIME)
    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}


  7>.多对多

eg:

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Teacher {
    private int id;
    private String name;
    private String sex;
    private Set<Student> students = new HashSet<Student>();
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @ManyToMany
    @JoinTable(name="t_s",---------------------------------------------------------------第三表的表名(自动为Teacher_Student)
        joinColumns={@JoinColumn(name="teacher_id")},--------------------------------第三表的第一个字段名(自动为teachers_id)
        inverseJoinColumns={@JoinColumn(name="student_id")}--------------------------第三表的第二个字段名(自动为students_id)
        )
    public Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }

}


import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Student {
    private int id;
    private String name;
    private String sex;
    private String password;
    private Date birthday;
    private Set<Teacher> teachers = new HashSet<Teacher>();
    
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    @Temporal(TemporalType.TIME)
    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @ManyToMany(mappedBy="students")
    public Set<Teacher> getTeachers() {
        return teachers;
    }
    public void setTeachers(Set<Teacher> teachers) {
        this.teachers = teachers;
    }
    
}


************级联关系中,如添加象@ManyToMany(cascade={CascadeType.ALL}),可以直接给级联表操作数据


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值