事实上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