Hibernate_3_客戶實例_數據庫中自動生成主從表

1)新建一個客戶類:

public class User {

	private Integer id;
	private String name;
	// 屬性爲集合類型,生命並實例化,實例化後,在其它類中就可以直接調用了
	private Set<String> addressSet = new HashSet<String>();

	public Integer getId() {
		return id;
	}

	public Set<String> getAddressSet() {
		return addressSet;
	}

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

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	// 重寫toString函數
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", addressSet="
				+ addressSet + "]";
	}
}

2)持久層執行的操作:

public class UserDao {
	/**
	 * save
	 */
	@Test
	public void save() {
		Session session = SessionFactoryTools.openSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();

			// 生成對象,設置屬性內容並保存
			User user = new User();
			user.setName("趙一");
			user.getAddressSet().add("山科B-12-209");
			user.getAddressSet().add("山科B-10-115");
			session.save(user);
			
			tx.commit();
		} catch (RuntimeException e) {
			tx.rollback();
			throw e;
		} finally {
			session.close();
		}
	}

	/**
	 * getById
	 */
	@Test
	public void getById() {
		Session session = SessionFactoryTools.openSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();

			// 獲取數據並打印
			User user = (User) session.get(User.class, 1);
			System.out.println(user);

			tx.commit();
		} catch (RuntimeException e) {
			tx.rollback();
			throw e;
		} finally {
			session.close();
		}
	}
}

3)主配置文件與1相同。

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">

<hibernate-mapping package="hibernate_3">
	<!-- 父類:包括主鍵和屬性 -->
	<class name="User" table="user">
		<!-- 
			主鍵:包塊主鍵的名字、類型和所對應的列的名字,以及主鍵增長策略 
			屬性:包括名字、類型和所對應的列的名字,以及屬性的長度
			子類:包括子類的名字和子類所對應的表的名字
			外鍵的名稱 ,外鍵會自動找到父類的主鍵並對應
		       子類中的元素:包括名字、所對應的列的名字
	        -->
		<id name="id" type="int" column="id">
			<generator class="native" />
		</id>
		<property name="name" type="string" column="name" length="20" />
		
		<set name="addressSet" table="user_addressSet">
			<key column="userId"></key>
			<element type="string" column="address"></element>
		</set>
			
	</class>
</hibernate-mapping>

運行會自動生成兩個表,一個父類表和一個子類表,子類表主要存儲集合屬性addressSet的內容。

*

上列中也可以使用List來存儲子表中的地址:

從表中的內容配置:

<!-- 子表對應的類名稱:addressList 
	  子表對應的類名稱:user_addressList 
	  子表的外鍵對應的列名:userId 
	  子表中的索引對應的列名:idx 
     子表元素:類型String、對應的列名address
-->
<list name="addressList" table="user_addressList">
	 <key column="userId"></key>
	 <list-index column="idx"></list-index>
	 <element type="string" column="address"></element>
</list>

客戶類中的addressList屬性要改爲:

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

持久化層中的保存要改爲:

User user = new User();
user.setName("王二");
user.getAddressList().add("山科B-12-209");
user.getAddressList().add("山科B-12-301");
user.getAddressList().add("山科B-10-115");
session.save(user);	
session.save(user);

其餘不變。

*

*

上列中也可以使用Map來存儲子表中的地址:

從表種的內容配置:

<!-- 子表對應的類名稱:addressMap
	  子表對應的類名稱:user_addressMap
	  子表的外鍵對應的類型及列名:String、key_
	  子表中的索引對應的列名:idx 
     子表元素:類型String、對應的列名address
-->
<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>

客戶類中的addressMap屬性要改爲:

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

持久化層中的保存要改爲:

User user = new User();
user.setName("趙六");
user.getAddressMap().put("地址一","山科B-12-209");
user.getAddressMap().put("地址二","山科B-12-301");
user.getAddressMap().put("地址三","山科B-10-115");
session.save(user);

其餘不變。

*

*

上列中也可以使用Bag來存儲子表中的地址:

從表種的內容配置:

<!-- 子表對應的類名稱:addressBag
	  子表對應的類名稱:user_addressBag
	  子表的外鍵對應的列名:UserId
     子表元素:類型String、對應的列名address
-->
<bag name="addressBag" table="user_addressBag">
			<key column="userId"></key>
			<element type="string" column="address"></element>
</bag>

客戶類中的addressBag屬性要改爲:

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

持久化層中的保存要改爲:

User user = new User();
user.setName("趙六");
user.getAddressBag().add("山科B-12-209");
user.getAddressBag().add("山科B-12-301");
user.getAddressBag().add("山科B-10-115");
user.getAddressBag().add("山科B-10-115");
session.save(user);

其餘不變。

*

*

<!-- 
  	當存儲的集合爲爲排序但可以排序的集合時,可以在次要配置文件中添加	order-by屬性,在order-by中設置按哪一種屬性排序,默認爲升序(asc)  
排列,設置爲desc時爲降序排列。
-->
<set name="addressSet" table="user_addressSet" order-by="address 	desc">
		<key column="userId"></key>
		<element type="string" column="address"></element>
</set>

按升序排列的輸出:

 addressSet=[山科B-10-115, 山科B-12-209, 山科B-12-301]]

按降序排列的輸出:

addressSet=[山科B-12-301, 山科B-12-209, 山科B-10-115]]

*


























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章