Hibernate的学习总结(容器映射)

    技术2025-09-24  115

    Hibernate中容器主要分为三大类:Set , List , Map

     

    要进行容器映射,数据库设计中的表就必须有外键约束。 

     

    一.Set容器映射

    1个人有许多不重复的邮箱地址。该种逻辑在数据库中一般设计为1张人表和一张邮件地址表。邮件地址表的主键参照人表的主键,人表的主键作为邮件地址表的外键。

    在JAVA中其实就是一个人POJO中包含一个容器类型属性mails。只需要设计一个人的POJO实体,而emils表就不必再对应一个实体类了。

    相应的建表语句为:

    -- 创建表CREATE TABLE person( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL , name VARCHAR(20)) ;CREATE TABLE emails( eid INT  , address VARCHAR(50) , foreign key (id) references person(id) on delete cascade ) ;

     

    Person.java

    import java.util.Set; public class Person { private Integer id ; private String name ; // 一个人拥有多个不同的email地址 private Set emails ; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getEmails() { return emails; } public void setEmails(Set emails) { this.emails = emails; } }

     

    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="org.lxh.hibernate.demo01.pojo.Person" table="person"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native"></generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="20" /> </property> <!-- set节点的name属性是POJO类中set所对应的属性名 --> <set name="emails" table="emails" lazy="false"> <!-- 指定emails表中的主键字段名 --> <key column="eid"></key> <element type="java.lang.String" column="address"></element> </set> </class> </hibernate-mapping>

     

    但在emails表中定义了外键约束后,对POJO的操作将会同步反映到2张表上。

     

    二.List容器映射

    例子为:一个人有许多本书,书可能买了一样的,但是买的时候是有先后之分的。同一本书有先后顺序之分。

    该映射与Set的区别在于Books的表中会多一个表示先后顺序的索引字段。

    建表语句:

    -- 创建表CREATE TABLE person( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL , name VARCHAR(20)) ;

    CREATE TABLE books( id INT  , posit int , title VARCHAR(30) , foreign key (id) references person(id) on delete cascade ) ;

     

    Person.java

    import java.util.List; public class Person { private Integer id ; private String name ; private List books ; public List getBooks() { return books; } public void setBooks(List books) { this.books = books; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

     

    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="org.lxh.hibernate.demo02.pojo.Person" table="person"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native"></generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="20" /> </property> <list name="books" table="books"> <key column="id"></key> <index column="posit"></index> <element type="java.lang.String" column="title"></element> </list> </class> </hibernate-mapping>

     

    三.Map容器映射

    例子:一个人有一个电话薄,电话薄里记录着某个人的姓名和电话,电话薄里面是姓名-电话的MAP关系。

    建表语句:

    -- 创建表CREATE TABLE person( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL , name VARCHAR(20)) ;CREATE TABLE phone( id INT  , name VARCHAR(20) , numbers VARCHAR(30), foreign key (id) references person(id) on delete cascade ) ;

     

    Person.java

    import java.util.Map; public class Person { private Integer id ; private String name ; private Map phone ; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Map getPhone() { return phone; } public void setPhone(Map phone) { this.phone = phone; } }

     

    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="org.lxh.hibernate.demo03.pojo.Person" table="person"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native"></generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="20" /> </property> <map name="phone" table="phone"> <key column="id"></key> <index type="java.lang.String" column="name"></index> <element type="java.lang.String" column="numbers"></element> </map> </class> </hibernate-mapping>

     

     

     

     

    最新回复(0)