ハイベルナーの一方通行は1対1が多いです.

7309 ワード

最近Hibernateを研究して、データベースの表の項目の多い対一の例を試みて、結果は失敗しました.最後にネットでブログを探してみました.このブログの住所を教えてください.http://blog.csdn.net/yinbodotcc/article/details/1505445
       今は何時にまとめますか?私の知っている落とし穴:
                               1,データベースのテーブルを作るときに外キーを指定する必要はありません.Hibernateは外キーのない2つのテーブルをxmlでマッピングします.
                               2,Eclipseの自動生成された*.java類と*.hbm.xml(データベーステーブルにマッピングされたクラスと対応するxmlファイル)に過度に依存しないでください.データベーステーブルではその意味上の外鍵(再構築時に指定する必要はない)はint型ですが、自動生成されたjavaファイルでも自動的にInteger型が生成されます.ただし、必ず自分で手を加えてその依頼の種類に変えてください.
                               3、のクラスは必ず依存系の完全なルートを書きます.
                               4,エラーが発生しました
                                could not initialize proxy-no Session     理由は、セッションが終了しました.
コードをつけてみます.
 
1、データベースを作成します.(外部キーを指定する必要はありません.)
 
2,マップクラスを自動的に生成します.
ロム:
package com.wjy.models;

// Generated 2014-1-21 10:36:04 by Hibernate Tools 3.4.0.CR1

/**
 * Room generated by hbm2java
 */
public class Room implements java.io.Serializable {

	private Integer id;
	private String address;

	public Room() {
	}

	public Room(String address) {
		this.address = address;
	}

	public Integer getId() {
		return this.id;
	}

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

	public String getAddress() {
		return this.address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

}
 User:
package com.wjy.models;

// Generated 2014-1-21 10:36:04 by Hibernate Tools 3.4.0.CR1

/**
 * User generated by hbm2java
 */
public class User implements java.io.Serializable {

	private Integer id;
	private String name;
	private Room room;       //    ,        Integer,    Room   。

	public User() {
	}

	public User(String name) {
		this.name = name;
	}

	public User(String name, Room room) {
		this.name = name;
		this.room = room;
	}

	public Integer getId() {
		return this.id;
	}

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

	public String getName() {
		return this.name;
	}

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

	public Room getRoom() {
		return room;
	}

	public void setRoom(Room room) {
		this.room = room;
	}


}
 
3と2を同時に生成する  *.hbm.xml:
ロム:
 
<?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 2014-1-21 10:36:04 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.wjy.models.Room" table="room" catalog="multone">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="address" type="string">
            <column name="address" length="100" not-null="true" />
        </property>
    </class>
</hibernate-mapping>
 User:
<?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 2014-1-21 10:36:04 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.wjy.models.User" table="user" catalog="multone">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="name" type="string">
            <column name="name" length="100" not-null="true" />
        </property>
        <many-to-one name="room" column="room_id" class="com.wjy.models.Room" cascade="all" outer-join="true">
	</many-to-one>     :     ,          。room *.java  ,room_id           。
    </class>
</hibernate-mapping>
 
4,hibernate.hbm.xmlにマッピングを追加します.
<mapping class="com.wjy.models.Room" resource="com/wjy/models/Room.hbm.xml"/>
<mapping class="com.wjy.models.User" resource="com/wjy/models/User.hbm.xml"/>
 
5,今テストコードを見てもいいです.
public void addUsers(){  
//    user        :Wjy Yhw,     。       ,room                。
		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		//    session  
		Session session=sessionFactory.openSession();
		//    
		Transaction transaction=session.beginTransaction();

		Room room1 = new Room();
		room1.setAddress("96#");

		User user1 = new User();
		user1.setName("Wjy");
		user1.setRoom(room1);////////////////////

		User user2 = new User();
		user2.setName("Yhw");
		user2.setRoom(room1);////////////////////
		
		
		//       
		session.save(user1);
		session.save(user2);
		//session.saveOrUpdate(model);
		transaction.commit();
		session.close();
	}
 データベースの変化を見てください.
 
6,これまで多対一のマッピングを実現してきました.データベーステーブルで指定する必要はなく、柔軟です.
public void getRoom(){

		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		//    session  
		Session session=sessionFactory.openSession();
		//    
		Transaction transaction=session.beginTransaction();

		String hql="from User where name='Yhw'";
		Query userList=session.createQuery(hql);
		
		List list=userList.list();
		
		//User user = (User) session.load(User.class, new Integer(1));

		//transaction.commit();
		
	
		Iterator iterator=list.iterator();
		User user=(User)iterator.next();
		System.out.println(user.getName()+"   in   "+user.getRoom().getAddress());
		
		//System.out.println(user.getName()+"   in   "+user.getRoom().getAddress());
		
		session.close();
	}
 以上のプログラムはUserに問い合わせる方法を二つ示しています.注釈されたのは第二の方法です.
私はソースコードをアップロードします.皆さんの参考にしてください.