映射基础

(1)基本实体映射技术

类和表映射

<hibernate-mapping package="hibernate.test.domain">  

<class name="Student" table="student" lazy="true">

</class>

</hibernate-mapping>

主键映射

<id name="id">

<generator class="uuid"/>

</id>

普通字段映射

<property name="sNo" column="sno" not-null="true"  type="java.lang.String"></property>

 

(2)多个字段作为主键

第一步:建立实体(Book

多个字段作为主键时,需要重新建一个类,包含作为主键的各个字段。在这里命名为BookName

//多个字段做主键

//Composite-id class must implement Serializable

public class BookName implements Serializable{

/**

 * 

 */

private static final long serialVersionUID = 1L;

private String name;

private String author;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAuthor() {

return author;

}

public void setAuthor(String author) {

this.author = author;

}

public BookName() {

super();

// TODO Auto-generated constructor stub

}

public BookName(String name, String author) {

super();

this.name = name;

this.author = author;

}


}

Book

package hibernate.test.domain;

 

public class Book {

private BookName id;

private String shortShow;

private String picture;

private String content;


public void setId(BookName id) {

this.id = id;

}

public BookName getId() {

return id;

}

public String getShortShow() {

return shortShow;

}

public void setShortShow(String shortShow) {

this.shortShow = shortShow;

}

public String getPicture() {

return picture;

}

public void setPicture(String picture) {

this.picture = picture;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}


}

 

第二步映射文件(Book.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 package="hibernate.test.domain">  

<class name="Book" table="Book" lazy="true">

<composite-id name="id" class="BookName">

<key-property name="name" type="java.lang.String" column="name"></key-property>

<key-property name="author" type="java.lang.String" column="author"></key-property>

</composite-id>

<property name="shortShow" column="shortShow" type="java.lang.String"></property>

<property name="picture" column="picture" type="java.lang.String"></property>

<property name="content" column="content" type="java.lang.String"></property>

</class>

</hibernate-mapping>

第三步:配置文件

mapping下添加映射文件位置:

<mapping resource="hibernate/test/xml/Book.hbm.xml"></mapping>

第四部:测试  插入数据

public static void main(String[] args) {

        Session session=null;

        Transaction tx=null;

        try {

        session=HibernateUtil.getSession();

        tx=session.beginTransaction();

        BookName bookName=new BookName("快乐是本","ytt");

        Book book=new Book();

        book.setId(bookName);

        book.setPicture("http://");

        book.setShortShow("简单介绍");

        book.setContent("介绍内容");

        session.save(book);

        tx.commit();

        } catch (Exception e) {

        // TODO: handle exception

        if(tx!=null)

        tx.rollback();

        }

        finally{

        if(session!=null)

        session.close();

        }

    }

数据库验证,插入成功! 

(3)组合关系映射(会产生很多冗余数据,大多还是通过一对多,多对多进行设计)

第一步 类的建立

public class Address {

private String city;

private String street;

private String zipcode;

public String getCity() {

return city;

}

public void setCity(String city) {

this.city = city;

}

public String getStreet() {

return street;

}

public void setStreet(String street) {

this.street = street;

}

public String getZipcode() {

return zipcode;

}

public void setZipcode(String zipcode) {

this.zipcode = zipcode;

}

public Address(String city, String street, String zipcode) {

super();

this.city = city;

this.street = street;

this.zipcode = zipcode;

}

public Address() {

super();

// TODO Auto-generated constructor stub

}

//组合关系测试

public class Person {

private int id;

private String name;

private Address address;

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 Address getAddress() {

return address;

}

public void setAddress(Address address) {

this.address = address;

}

}

第二步 映射文件

<?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="hibernate.test.domain">  

<class name="Person" table="Person" lazy="true">

<id name="id">

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

</id>

<property name="name"></property>

<component name="address" class="Address">

<property name="city"></property>

<property name="street"></property>

<property name="zipcode"></property>

</component>

</class>

</hibernate-mapping>

第三步 配置文件

  <mapping resource="hibernate/test/xml/Person.hbm.xml"></mapping>

第四步 测试

public static void main(String[] args) {

// TODO Auto-generated method stub

Session session=null;

Transaction tx=null;

try {

session=HibernateUtil.getSession();

tx=session.beginTransaction();

Address address=new Address("郑州", "商都路G107国道", "0371");

Person person=new Person();

person.setName("ytt");

person.setAddress(address);

session.save(person);

tx.commit();

} catch (Exception e) {

// TODO: handle exception

if(tx!=null)

{

tx.rollback();

}

}

finally{

session.close();

}

}

 

实际上是一张表,插入语句时这个:

Hibernate: insert into Person (name, city, street, zipcode) values (?, ?, ?, ?)

 

(4)大对象映射

Clob 文本大对象 最长4G

Blob 二进制数据大对象 最长4G

这个也不是很常用,就像其他类型一样使用,在映射文件中,type改为“java.sql.Blob/Clob”就行。