1.hibernate.cfg.xml
| 代碼如下 |
複製代碼 |
<!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> <!-- 設定資料庫方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 設定資料庫的驅動 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 設定資料庫使用者名稱 --> <property name="hibernate.connection.username">root</property> <!-- 設定資料庫的密碼 --> <property name="hibernate.connection.password">root</property> <!-- 設定資料庫的url --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> <!-- 配置資料池的最大容量 --> <property name="hibernate.c3p0.max_size">20</property> <!-- 配置資料池的最小容量 --> <property name="hibernate.c3p0.min_size">1</property> <!-- 配置資料連結的逾時界限 --> <property name="hibernate.c3p0.timeout">5000</property> <!-- 在控制台顯示後台是否列印執行的sql --> <property name="hibernate.show_sql">true</property> <!-- 是否以友好的格式顯示列印的sql --> <property name="hibernate.format_sql">true</property> <!-- 列印一些輔助性的注釋 --> <property name="hibernate.use_sql_comments">true</property> <property name="hibernate.c3p0.max_statements">100</property> <property name="hibernate.c3p0.idle_test_period">3000</property> <property name="hibernate.c3p0.acquire_increment">2</property> <property name="hibernate.c3p0.validate">true</property> <!-- 配置資料操作的方式 --> <property name="hbm2ddl.auto">create</property> <!-- 將我們上面 Member 的對應檔添加進來 --> <mapping resource="org/Rudiment/hibernate/Member.hbm.xml" /> </session-factory> </hibernate-configuration> |
2.持久化類 Member.java
| 代碼如下 |
複製代碼 |
package org.Rudiment.hibernate; import java.util.HashMap; import java.util.Map; public class Member { private Integer id; private String name; private Integer age; private Map<String, Address> addresses = new HashMap<String, Address>(); public Map<String, Address> getAddresses() { return addresses; } public void setAddresses(Map<String, Address> addresses) { this.addresses = addresses; } 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } |
3.持久化類的組件類
| 代碼如下 |
複製代碼 |
package org.Rudiment.hibernate; import java.util.HashMap; import java.util.Map; public class Address { private String street; private String zipCode; private String city; private Member owner; public Member getOwner() { return owner; } public void setOwner(Member owner) { this.owner = owner; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getZipCode() { return zipCode; } public void setZipCode(String zipCode) { this.zipCode = zipCode; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } } |
4.持久化類的對應檔
| 代碼如下 |
複製代碼 |
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2013-9-9 19:50:34 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping package="org.Rudiment.hibernate"> <class name="Member" table="TEST_MEMBER"> <id name="id" column="ID"> <generator class="native"></generator> </id> <property name="age" column="AGE"></property> <property name="name" column="NAME"></property> <map name="addresses" table="test_component"> <key column="component_id" not-null="true" /> <map-key column="component_key" type="string" /> <composite-element class="Address"> <parent name="owner"/> <property name="street" column="home_street"></property> <property name="zipCode" column="home_zip_code"></property> <property name="city" column="home_city"></property> </composite-element> </map> </class> </hibernate-mapping> |
5.持久化類的操縱類 MemberHandler.java
| 代碼如下 |
複製代碼 |
package org.Rudiment.hibernate; import java.util.HashMap; import java.util.Map; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class MemberHandler { public static void insert() { Configuration conf = new Configuration(); conf.configure(); ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry(); SessionFactory sf = conf.buildSessionFactory(sr); Session session = sf.openSession(); session.beginTransaction(); Member m = new Member(); m.setAge(24); m.setName("Louis"); Address ad1 = new Address(); ad1.setCity("廣州"); ad1.setOwner(m); ad1.setStreet("一號街"); ad1.setZipCode("123"); Address ad2 = new Address(); ad2.setCity("深圳"); ad2.setOwner(m); ad2.setStreet("二號街"); ad2.setZipCode("456"); Map<String, Address> am = new HashMap<String, Address>(); am.put("地址一", ad1); am.put("地址二", ad2); m.setAddresses(am); session.save(m); session.getTransaction().commit(); session.close(); } public static void main(String[] args) { insert(); } } |
注:
當運行MemberHandler的時候將發現,後台資料庫多了一個 test_member 和 test_component 的資料表,表的內容如下:
| 代碼如下 |
複製代碼 |
mysql> show tables; +---------------------+ | Tables_in_hibernate | +---------------------+ | test_component | | test_member | +---------------------+ 2 rows in set (0.00 sec) mysql> select * from test_member; +----+------+-------+ | ID | AGE | NAME | +----+------+-------+ | 1 | 24 | Louis | +----+------+-------+ 1 row in set (0.00 sec) mysql> select * from test_component; +--------------+-------------+---------------+-----------+---------------+ | component_id | home_street | home_zip_code | home_city | component_key | +--------------+-------------+---------------+-----------+---------------+ | 1 | 一號街 | 123 | 廣州 | 地址一 | | 1 | 二號街 | 456 | 深圳 | 地址二 | +--------------+-------------+---------------+-----------+---------------+ 2 rows in set (0.00 sec) |