您的位置:首页 > 其它

[Hibernate] - one to many

2014-08-25 11:50 309 查看
事实上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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: