[Hibernate] - one to many

事实上one to many 和 many to one是一样的,这是一个相互的过程。

 

hibernate.cfg.xml

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

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1/testdb</property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <mapping resource="com/my/hbm/User.hbm.xml"/>
        <mapping resource="com/my/hbm/Card.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

 

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.my.bean.User" table="user">
        <id name="id" type="long" column="id">
            <generator class="native"></generator>
        </id>
        <property name="userName" column="user_name" type="java.lang.String" length="100" not-null="true"/>
        <set name="card" cascade="all">
            <key column="user_id"/>
            <one-to-many class="com.my.bean.Card"/>
        </set>
    </class>
</hibernate-mapping>

Card.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.my.bean.Card" table="card">
        <id name="id" column="id" type="long">
            <generator class="native"></generator>
        </id>
        <many-to-one name="user" column="user_id" class="com.my.bean.User" not-null="true" cascade="save-update"></many-to-one>
        <property name="cardName" column="card_name" type="java.lang.String" length="100" not-null="true"/>
    </class>
</hibernate-mapping>

 

POJO:

package com.my.bean;

import java.util.Set;

public class User {
    private long id;
    private String userName;
    private Set<Card> card;
    
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Set<Card> getCard() {
        return card;
    }
    public void setCard(Set<Card> card) {
        this.card = card;
    }
}
package com.my.bean;

public class Card {
    private long id;
    private String cardName;
    private User user;
    
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getCardName() {
        return cardName;
    }
    public void setCardName(String cardName) {
        this.cardName = cardName;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

 

Test:

package com.my.init;

import java.util.HashSet;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.my.bean.Card;
import com.my.bean.User;
import com.my.dao.util.HibernateUtil;

public class Test {

    public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();

        try {
            // create user
            User user = new User();
            user.setUserName("Robin");
            
            // create card for CBC
            Card cardCBC = new Card();
            cardCBC.setCardName("CBC");
            cardCBC.setUser(user);
            // create card for BBC
            Card cardBBC = new Card();
            cardBBC.setCardName("BBC");
            cardBBC.setUser(user);
            
            // add user card
            user.setCard(new HashSet<Card>());
            user.getCard().add(cardCBC);
            user.getCard().add(cardBBC);
            
            // save action
            session.save(user);
            session.save(cardCBC);
            session.save(cardBBC);
            
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }

}

 

在Card.hbm.xml中如果去掉many-to-one节点和在Card bean中移除user的getter/setter,事实上在DB生成的数据表结构是一样的。

如果移除这个many-to-one,那么在使用时,可以不需要setUser(..)。可以简洁的写代码。

但一般情况下,user和card是相互的,对user来说是一对多,对card来说是多对一。所以在user中写one-to-many,在card中写many-to-one.

 

参考引用:

http://www.tutorialspoint.com/hibernate/hibernate_one_to_many_mapping.htm

posted @ 2014-08-25 11:50  横渡  阅读(443)  评论(0编辑  收藏  举报