(转)Hibernate框架基础——映射集合属性

http://blog.csdn.net/yerenyuan_pku/article/details/52745486

集合映射

集合属性大致有两种

  • 单纯的集合属性,如像List、Set或数组等集合属性。
  • Map结构的集合属性,每个属性值都有对应的Key映射。

集合映射的元素大致有如下几种

  • list:用于映射List集合属性。
  • set:用于映射Set集合属性。
  • map:用于映射Map集合性。
  • array:用于映射数组集合属性。
  • bag:用于映射无序集合。
  • idbag:用于映射无序集合,但为集合增加逻辑次序。

接下来我们就来一一详解以上集合映射的元素。

Set

Set是无序,不可重复的集合。 
以案例的方式来介绍映射Set集合属性,大概效果好点,并且在讲解其他集合属性时,我们都会遵循这点。试看这样一个案例,在生活中,我们都已会网上购物,在填写收货地址时,我们大概都会写多个收货地址,想想看是不是这样?我们可以剖析这个案例,作为介绍映射Set集合属性的基石。 
我们在Eclipse中新建一个普通的Java工程,如Hibernate_Test,接着我们搭建好Hibernate的开发环境,这个不说了。然后我们在cn.itcast.e_hbm_collection包下新建一个Java类——User.java,用于表示一个个用户。

public class User {
    private Integer id; // 推荐使用包装类
    private String name;

    private Set<String> addressSet; // 未初始化的Set集合

    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<String> getAddressSet() {
        return addressSet;
    }

    public void setAddressSet(Set<String> addressSet) {
        this.addressSet = addressSet;
    }
}

接下来我们是该要创建出该类对应的映射配置文件的,在做之前,我们总该要分析出数据库中的表结构吧!只要分析出来,那创建相应的映射配置文件还不是分分钟的事情,我们可以用下图来表示: 

这样,我们就能依葫芦画瓢写出映射配置文件——User.hbm.xml了。记住,该映射配置文件还得和User类待在一块,即在同一个包下。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.itcast.e_hbm_collection">
    <class name="User" table="user">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name" />
        <!--
            addressSet属性,Set集合
            table属性:集合表的名字
            key子元素:集合外键的列名
            element子元素:存放集合元素的列的信息
        -->
        <set name="addressSet" table="user_addressSet">
            <key column="userId"></key>
            <element type="string" column="address"></element>
        </set>
    </class>
</hibernate-mapping>
  • table属性:集合表的名字。
  • key子元素:集合外键的列名。
  • element子元素:存放集合元素的列的信息。

为了便于测试,我们总是会编写一个单元测试类,所以我们还应在cn.itcast.e_hbm_collection包下创建出这样一个类——App.java。

public class App {

    private static SessionFactory sessionFactory = new Configuration() //
            .configure() //
            .addClass(User.class) // 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    @Test
    public void testSave() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 构建对象
        Set<String> set = new HashSet<String>();
        set.add("御富科贸园xxx");
        set.add("棠东东路");

        User user = new User();
        user.setName("张天一");
        user.setAddressSet(set);

        // 保存
        session.save(user);

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void testGet() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 获取数据
        User user = (User) session.get(User.class, 1);
        // 显示信息
        System.out.println(user.getName());
        System.out.println(user.getAddressSet());

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }
}

测试,会发现毫无问题,大发! 
但有时候,我们会发现User类中的addressSet属性已经初始化过了,如:

public class User {
    private Integer id; // 推荐使用包装类
    private String name;

    private Set<String> addressSet = new HashSet<String>(); // Set集合

    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<String> getAddressSet() {
        return addressSet;
    }

    public void setAddressSet(Set<String> addressSet) {
        this.addressSet = addressSet;
    }
}
  • 1

我都是初始化集合属性的,因为这样写还是很有还好处的,那就是我们编写测试代码的时候少写一点代码,相应地单元测试类——App.java的代码就要改为:

public class App {

    private static SessionFactory sessionFactory = new Configuration() //
            .configure() //
            .addClass(User.class) // 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    @Test
    public void testSave() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 构建对象
        User user = new User();
        user.setName("张天二");
        user.getAddressSet().add("御富科贸园xxx");
        user.getAddressSet().add("棠东东路");

        // 保存
        session.save(user);

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void testGet() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 获取数据
        User user = (User) session.get(User.class, 2);
        // 显示信息
        System.out.println(user.getName());
        System.out.println(user.getAddressSet());

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }
}

测试,一致通过,大发! 
注意:映射Set集合属性时,如果element元素包括not-null=”true”属性,则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键。但List集合属性不会,List集合属性总是以外键列和元素次序列作为联合主键

排序用的sort属性

重申一遍,Set是无序,不可重复的集合。但有时不可避免地要让Set集合中的元素具有一定顺序,这时就可以用到sort属性了,如我们要让Set集合中的字符串按照自然顺序排序,我们可以修改映射配置文件——User.hbm.xml为:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.itcast.e_hbm_collection">
    <class name="User" table="user">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name" />
        <!--
            addressSet属性,Set集合
            table属性:集合表的名字
            key子元素:集合外键的列名
            element子元素:存放集合元素的列的信息
            sort="unsorted|natural|comparatorClass"
                默认为:unsorted
        -->
        <set name="addressSet" table="user_addressSet" sort="natural">
            <key column="userId"></key>
            <element type="string" column="address"></element>
        </set>
    </class>
</hibernate-mapping>
  • 1

sort属性的取值有:unsorted、natural、comparatorClass,默认值为unsorted。 
为了更加方便于我们看清Set集合中的字符串是按照自然顺序排序的,我们最好将App类的代码修改为:

public class App {

    private static SessionFactory sessionFactory = new Configuration() //
            .configure() //
            .addClass(User.class) // 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    @Test
    public void testSave() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 构建对象
        User user = new User();
        user.setName("张天一");
        user.getAddressSet().add("2御富科贸园");
        user.getAddressSet().add("1棠东东路");

        // 保存
        session.save(user);

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void testGet() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 获取数据
        User user = (User) session.get(User.class, 1);
        // 显示信息
        System.out.println(user.getName());
        System.out.println(user.getAddressSet());

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }
}

当测试testSave()方法时,会发现报异常:java.lang.ClassCastException: java.util.HashSet cannot be cast to java.util.SortedSet。出现异常,我们就要解决嘛!解决办法很简单,我们只须修改App类的代码为:

public class App {

    private static SessionFactory sessionFactory = new Configuration() //
            .configure() //
            .addClass(User.class) // 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    @Test
    public void testSave() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 构建对象
        User user = new User();
        user.setName("张天一");
        user.setAddressSet(new TreeSet<String>()); // 当设置了sort属性时,就要使用SortedSet类型
        user.getAddressSet().add("2御富科贸园");
        user.getAddressSet().add("1棠东东路");

        // 保存
        session.save(user);

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void testGet() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 获取数据
        User user = (User) session.get(User.class, 1);
        // 显示信息
        System.out.println(user.getName());
        System.out.println(user.getAddressSet());

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }
}

测试,会发现Eclipse的控制台打印: 

排序用的order by属性

要让Set集合中的元素具有一定顺序,上面使用了sort属性,但是该排序是在计算机内存中进行的,效率比较偏低,如果希望效率高点,我们可以使用order by属性,它应该是就在数据库中就排好序了。为了测试这点,我们将映射配置文件——User.hbm.xml改为:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.itcast.e_hbm_collection">
    <class name="User" table="user">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name" />
        <!--
            addressSet属性,Set集合
            table属性:集合表的名字
            key子元素:集合外键的列名
            element子元素:存放集合元素的列的信息
            sort="unsorted|natural|comparatorClass"
                默认为:unsorted
            order-by属性:写的是order by子句,是SQL语句,是操作的集合表。
                这是在查询数据时指定的order by子句。(排序推荐使用order-by属性,效率高)
        -->
        <set name="addressSet" table="user_addressSet" order-by="address DESC">
            <key column="userId"></key>
            <element type="string" column="address"></element>
        </set>
    </class>
</hibernate-mapping>

我们又要修改App类的代码了。

public class App {

    private static SessionFactory sessionFactory = new Configuration() //
            .configure() //
            .addClass(User.class) // 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    @Test
    public void testSave() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 构建对象
        User user = new User();
        user.setName("张天一");
        // user.setAddressSet(new TreeSet<String>()); // 当设置了sort属性时,就要使用SortedSet类型
        user.getAddressSet().add("2御富科贸园");
        user.getAddressSet().add("1棠东东路");

        // 保存
        session.save(user);

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void testGet() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 获取数据
        User user = (User) session.get(User.class, 2);
        // 显示信息
        System.out.println(user.getName());
        System.out.println(user.getAddressSet());

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }
}
  • 1

测试,我们会发现Eclipse控制台打印: 

List

List是有序集合,因此持久化到数据库时必须增加一列来表示集合元素的次序。 
集合属性只能以接口声明(当持久化某个实例时,Hibernate会自动把程序中的集合实现类替换成Hibernate自己的集合实现类),因此下面代码中,addressList的类型只能是List,而不能是ArrayList。

private List<String> addressList = new ArrayList<String>(); // List集合
  • 1
  • 1

为了介绍映射List集合属性,我们需要将User类的代码置为:

public class User {
    private Integer id; // 推荐使用包装类
    private String name;

    private List<String> addressList = new ArrayList<String>(); // List集合

    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 List<String> getAddressList() {
        return addressList;
    }

    public void setAddressList(List<String> addressList) {
        this.addressList = addressList;
    }
}
  • 1

同样,在创建出该类所对应的映射配置文件之前,我们还要分析出数据库中的表结构!我们可以用下图来表示: 

接下来我们就要修改映射配置文件——User.hbm.xml的内容了。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.itcast.e_hbm_collection">
    <class name="User" table="user">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name" />
        <!--
            addressList属性,List集合
            list-index:用于存放索引的列
        -->
        <list name="addressList" table="user_addressList">
            <key column="userId"></key>
            <list-index column="idx"></list-index>
            <element type="string" column="address"></element>
        </list>
    </class>
</hibernate-mapping>

映射说明

  • list元素要求用list-index的子元素来映射有序集合的次序列。
  • 集合的属性的值会存放在另外的表中,须以外键关联,用Key元素来映射外键列。
  • 当集合元素是基本数据类型及其包装类,字符串或日期类型时使用 element来映射集合属性。

之后我们每讲一个映射集合属性,都遵循这样一个原则——将数据库hibernate_20160926中的user表和userXxx表删干净,还给大家一片净土,便于大家查看测试后的结果。接下来,我们要将App类的代码修改为:

public class App {

    private static SessionFactory sessionFactory = new Configuration() //
            .configure() //
            .addClass(User.class) // 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    @Test
    public void testSave() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 构建对象
        User user = new User();
        user.setName("张天一");
        user.getAddressList().add("御富科贸园");
        user.getAddressList().add("棠东东路");
        user.getAddressList().add("棠东东路");

        // 保存
        session.save(user);

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void testGet() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 获取数据
        User user = (User) session.get(User.class, 1);
        // 显示信息
        System.out.println(user.getName());
        System.out.println(user.getAddressList());

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }
}
  • 1

测试,顺利通过,大发!

数组

数组属性的映射和List的处理方式基本一致。数组使用<array>元素完成完成映射。 
为了介绍映射数组属性,我们需要将User类的代码置为:

public class User {
    private Integer id; // 推荐使用包装类
    private String name;

    private String[] addressArray; // 数组

    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 String[] getAddressArray() {
        return addressArray;
    }

    public void setAddressArray(String[] addressArray) {
        this.addressArray = addressArray;
    }
}
  • 1

接下来我们就要修改映射配置文件——User.hbm.xml的内容了。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.itcast.e_hbm_collection">
    <class name="User" table="user">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name" />
        <!-- addressArray属性,数组。与List的映射基本一致  -->
        <array name="addressArray" table="user_addressArray">
            <key column="userId"></key>
            <list-index column="idx"></list-index>
            <element type="string" column="address"></element>
        </array>
    </class>
</hibernate-mapping>
  • 1

最后,我们要将App类的代码修改为:

public class App {

    private static SessionFactory sessionFactory = new Configuration() //
            .configure() //
            .addClass(User.class) // 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    @Test
    public void testSave() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 构建对象
        User user = new User();
        user.setName("张天一");
        user.setAddressArray(new String[] { "御富科贸园", "棠东东路" });

        // 保存
        session.save(user);

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void testGet() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 获取数据
        User user = (User) session.get(User.class, 1);
        // 显示信息
        System.out.println(user.getName());
        System.out.println(Arrays.toString(user.getAddressArray()));

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }
}
  • 1

测试,顺利通过,大发!

Map

  • Map不仅需要映射属性值,还需要映射属性Key。
  • Hibnernate将以外键列和Key列作为联合主键。
  • Map集合属性使用map元素映射,该元素需要key和map-key两个子元素。 
    • key子元素用于映射外键列。
    • map-key子元素则用于映射Map集合的Key。
    • map-key和element元素都必须确定type属性。

为了介绍映射Map集合属性,我们需要将User类的代码置为:

public class User {
    private Integer id; // 推荐使用包装类
    private String name;

    private Map<String, String> addressMap = new HashMap<String, String>(); // Map集合

    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<String, String> getAddressMap() {
        return addressMap;
    }

    public void setAddressMap(Map<String, String> addressMap) {
        this.addressMap = addressMap;
    }
}

同样,在创建出该类所对应的映射配置文件之前,我们还要分析出数据库中的表结构!我们可以用下图来表示: 

接下来我们就要修改映射配置文件——User.hbm.xml的内容了。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.itcast.e_hbm_collection">
    <class name="User" table="user">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name" />
        <!-- addressMap属性,Map集合 -->
        <map name="addressMap" table="user_addressMap">
            <key column="userId"></key>
            <map-key type="string" column="key_"></map-key>
            <element type="string" column="address"></element>
        </map>
    </class>
</hibernate-mapping>

最后,我们要将App类的代码修改为:

public class App {

    private static SessionFactory sessionFactory = new Configuration() //
            .configure() //
            .addClass(User.class) // 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    @Test
    public void testSave() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 构建对象
        User user = new User();
        user.setName("张天一");
        user.getAddressMap().put("公司", "御富科贸园");
        user.getAddressMap().put("家庭", "棠东东路");

        // 保存
        session.save(user);

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void testGet() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 获取数据
        User user = (User) session.get(User.class, 1);
        // 显示信息
        System.out.println(user.getName());
        System.out.println(user.getAddressMap());

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }
}

测试,顺利通过,大发!

Bag

Bag的特性是:允许重复的元素,但无序。在Java的标准API中并没有提供Bag容器,Hibernate提供自己的Bag实现,允许您将List映射为Bag。

  • bag元素既可以为List集合属性映射,也可以为Collection集合属性映射。
  • 不管是哪种集合属性,使用bag元素都将被映射成无序集合,而集合属性对应的表没有主键。
  • bag元素只需要key元素来映射外键列,使用element元素来映射集合属性的每个元素。

为了介绍映射Bag集合属性,我们需要将User类的代码置为:

public class User {
    private Integer id; // 推荐使用包装类
    private String name;

    private List<String> addressBag = new ArrayList<String>();

    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 List<String> getAddressBag() {
        return addressBag;
    }

    public void setAddressBag(List<String> addressBag) {
        this.addressBag = addressBag;
    }
}

接下来我们就要修改映射配置文件——User.hbm.xml的内容了。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.itcast.e_hbm_collection">
    <class name="User" table="user">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name" />
        <!-- addressBag属性,Bag集合:无序,可重复。与Set集合的映射基本一致 -->
        <bag name="addressBag" table="user_addressBag">
            <key column="userId"></key>
            <element type="string" column="address"></element>
        </bag>
    </class>
</hibernate-mapping>

最后,我们要将App类的代码修改为:

public class App {

    private static SessionFactory sessionFactory = new Configuration() //
            .configure() //
            .addClass(User.class) // 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    @Test
    public void testSave() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 构建对象
        User user = new User();
        user.setName("张天一");
        user.getAddressBag().add("御富科贸园");
        user.getAddressBag().add("棠东东路");
        user.getAddressBag().add("棠东东路");

        // 保存
        session.save(user);

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void testGet() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // -------------------------------------------

        // 获取数据
        User user = (User) session.get(User.class, 1);
        // 显示信息
        System.out.println(user.getName());
        System.out.println(user.getAddressBag());

        // -------------------------------------------
        session.getTransaction().commit();
        session.close();
    }
}

测试,顺利通过,大发!

时间: 2025-01-12 21:59:12

(转)Hibernate框架基础——映射集合属性的相关文章

(转)Hibernate框架基础——一对多关联关系映射

http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即集合元素是普通类型).现在从本文开始我们就要介绍实体类型的集合(即集合元素是另一个实体)了. 一对多关联关系映射 我们还是以一个活生生的例子来详解一对多关联关系映射吧!就以部门和员工的关系为例. 单向关联:仅仅建立从Employee到Department的多对一关联,即仅仅在Employee类中定义

1-6 hibernate映射集合属性

1.集合类框架 以Tree开头都是按顺序,默认情况下是升序排列. 以Linked 开头的都是按插入顺序排列的. 2.在hibernate中要持久化集合属性时必须将其声明为接口,如 private Set parts=new HashSet(); set元素 3.集合类接口及其常用的实现类: 4.map元素的映射 5.集合外键

浅谈Hibernate中映射集合属性以及主键和外键

首先说明一下什么叫主键以及外键. 主键和外键是对于数据库来说的,数据库的表才有主键外键的说法. 主键:主键是指标识某个表中唯一且非空的一条记录行的列,这个列中的值不允许有重复的值,用于确定一个表中的一条记录,实际上主键就是告诉别人:这个数据列是唯一的. 外键:引用另外一个表中的主键,在当前表中不一定为唯一的,但是在被引用表中一般唯一.对于关系型数据库来说(比如MySQL)外键是联系数据表之间的唯一方式,主要目的是控制存储在外键表中的数据. 建立外键的前提:本表的列必须与外键类型相同(外键必须是外

hibernate映射集合属性

注意:持久化集合字段必须声明为接口,两个持久化对象不能共享同一个集合元素的引用. 映射集合属性 @ElementCollection{ fetch targetClass } 映射集合属性表 @CollectionTable{ name catalog schema indexes joinColumns uniqueConstraints } @JoinColumn{ columnDefinition name insertable updatable nullable table uniqu

Hibernate框架基础

Hibernate框架基础 Hibernate框架 ORM概念 O, Object 对象 R, Realtion 关系 (关系型数据库: MySQL, Oracle-) M,Mapping 映射 ORM, 对象关系映射! ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象? 想做到上面2点,必须要有映射! 总结: Hibernate与ORM的关系? Hibernate是ORM的实现! Hibernate HelloWorld案例 搭建一个H

(转)Hibernate框架基础——多对多关联关系映射

http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个学生可以选修多门课程,一个课程可以被多名学生选修.在关系型数据库中对于多对多关联关系的处理一般采用中间表的形式,将多对多的关系转化成两个一对多的关系. 为了详细介绍多对多关联关系映射,终究还是应以一个例子来说明比较印象深刻.我们以老师和学生的关系为例来说明这种多对多关联关系映射. 双向多对多 我们最

(转)Hibernate框架基础——Hibernate API及Hibernate主配置文件

Hibernate的学习路线图 Hibernate API简介 Configuration Configuration类负责管理Hibernate的配置信息,包括如下内容: Hibernate运行的底层信息:数据库的URL.用户名.密码.JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件). 持久化类与数据表的映射关系(*.hbm.xml文件). 创建Configuration的两种方式: 属性文件(hibernate.properties) Con

Hibernate之映射集合属性

这里先将集合Set在数据库中的存储.就是新建一个表,新建的表的主键对应另一张的外键,而集合的每个值对应一条记录,以同一个set的数据以主键值相同的记录区分. package test.hibernate.set; import java.util.Set; public class User { private Integer id; private String name; private Set<String> addressSet; public Integer getId() { re

Hibernate框架关系映射

接触Hibernate也有一小段的时间了,愈发的觉得Hibernate是个神奇的东西,为什么这么说呢?因为你可以不懂一行sql,直接面向对象,就可以将数据直接保存到数据库去!! 你还可以保存一个对象,然后一次性的将与它相关的所有数据保存到数据库,比如说,你只需要保存班级对象,就可以将该班级信息和该班级下的所有学生在数据库中形成一堆的记录. 而且都不需要你写sql!!! 有木有很神奇....反正宝宝我是惊呆了. 下面就拿具体的代码实现来讲吧~ 首先讲一个简单的  单向一对多的案例(以班级和学生作为