ハイベルナーの一方通行は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,マップクラスを自動的に生成します.
ロム:
3と2を同時に生成する *.hbm.xml:
ロム:
4,hibernate.hbm.xmlにマッピングを追加します.
5,今テストコードを見てもいいです.
6,これまで多対一のマッピングを実現してきました.データベーステーブルで指定する必要はなく、柔軟です.
私はソースコードをアップロードします.皆さんの参考にしてください.
今は何時にまとめますか?私の知っている落とし穴:
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に問い合わせる方法を二つ示しています.注釈されたのは第二の方法です.私はソースコードをアップロードします.皆さんの参考にしてください.