- 追加された行はこの色です。
- 削除された行はこの色です。
#topicpath
----
//ここにコンテンツを記述します。
#contents
**基本操作 [#f67e50ad]
***HQLでクエリを発行する [#r42f3f74]
SessionFactory sessionfactory = config.buildSessionFactory();
session = sessionfactory.openSession();
List list = session.find("from UserId as userid where userid.userId like 'Masatomi%'");
↑ 結果(UserIdクラス)の格納されたListが返ってくる
''Hibernate3.0から上のfindはdeprecatedになりました。3.0からは''
Query query = session.createQuery
("from UserId as userid where userid.userId like 'Masatomi%'");
List messages = query.list();
''としてください。''
HQLの文法などはいろんなサイトで説明されているので割愛。上の意味だけ。
from UserId[1] as userid[2] where userid[2].userId[3] like 'Masatomi%'
↑ 意味は、[1]のクラスを検索します。条件は[3]のフィールドが'Masatomi%'であるようなレコード
↑ [2]はエイリアスなんでなんでもよいでしょう
***キー値指定で直接レコードを取得する [#xad1af6b]
SessionFactory sessionfactory = config.buildSessionFactory();
session = sessionfactory.openSession();
UserId aUser=(UserId)session.load(UserId.class,"Masatomi"); <- 第二引数がUniqueKeyの値
***レコードのUpdate [#r79ca966]
SessionFactory sessionfactory = config.buildSessionFactory();
session = sessionfactory.openSession();
UserId aUser=(UserId)session.load(UserId.class,"Masatomi");
userid.setGroupId("GROUP01");
session.flush();
session.connection().commit(); //コレしないと、行ロックしちゃうっぽい
***レコードのInsert [#xb11d51c]
SessionFactory sessionfactory = config.buildSessionFactory();
session = sessionfactory.openSession();
UserId userid = new UserId("HOGEHOGE");
userid.setGroupId("1111");
//その他必要なカラムをセット
session.save(userid);
session.flush();
session.connection().commit();
***レコードのDelete [#r74a3a42]
SessionFactory sessionfactory = config.buildSessionFactory();
session = sessionfactory.openSession();
UserId userid=(UserId) session.load(UserId.class,"HOGEHOGE");
session.delete(userid);
session.flush();
session.connection().commit();
**その他 [#d3d6a0ad]
***複数の設定ファイルを使用したい [#l648af06]
hibernate.cfg.xmlはどうもひとつのデータベース設定しか書けないみたい(たぶん)。
でも場合によっては一つのデータベースだけではなく、複数のデータベースに接続することがあります。そのときに、複数の設定ファイルを切り替える方法がようやく分かりました。ちなみにTorqueで試行錯誤した経緯は[[Torque/複数のDBで同時に利用する]]をご参照。
Configuration config = new Configuration();
// config = config.configure(); // <-通常の設定の読み込み
config = config.configure(new File(
getServlet().getServletContext().getRealPath(
"/WEB-INF/lib/hibernate.cfg.hoge.xml")));
このようにすることで、ランタイムに設定ファイルを指定することが出来るようです。。
***結合(関連)を考える [#t380b000]
#ref(fig1.gif)
- Member -> WorkGroupを表現する
JavaBeans(ここではMember)にプロパティを追加してマッピングファイル(Member.hbm.xml)に
<many-to-one name ="workgroup" column="GROUPNO"
class="nu.mine.kino.binding.ait.hibernate.Workgroup" cascade="all" outer-join="auto"
update="false" insert="false" />
を追加すればよいようだ。追加しない場合はMember#getWorkgroup()の返り値がnullになるみたい。
Member(N) -> WorkGroup(1) なので、many-to-oneとなる
- WorkGroup -> Memberを表現する
JavaBeans(ここではWorkGroup)にプロパティを追加してマッピングファイル(WorkGroup.hbm.xml)に
<set name="memberList" >
<key ><column name="groupno" /></key>
<one-to-many class="nu.mine.kino.binding.ait.hibernate.Member" />
</set>
を追加すればよいようだ。追加しない場合はWorkgroup#getMemberList()の返り値がnullになるみたい。
WorkGroup(1) -> Member(N) なので、one-to-manyとなる
クラス設計で考えるとWorkGroup -> Member はあってもその逆はあまりないかなぁ。ようするに
aWorkGroup.getMembers()
はあっても
aMember.getWorkGroup()
はないことが多いように思うけど。。。
http://www.atmarkit.co.jp/fjava/rensai3/ormap05/ormap05_1.html
***WEBアプリの時、設定ファイルなどはどこに置くべきか。 [#yb683b06]
:hibernate.cfg.xml|classesの直下などに置いて、各リソースの設定ファイルは
<mapping resource="nu/mine/kino/MtAuthor.hbm.xml" />
などと指定する
:各オブジェクトの設定ファイル|Javaファイルと同じ場所に置く。
***middlegenで作ったhbmファイルについて [#d5bf7378]
たとえば
<id name="id" type="java.lang.Integer" column="id" >
<meta attribute="field-description">
@hibernate.id
generator-class="Increment"
type="java.lang.Integer"
column="id"
</meta>
<generator class="Increment" />
</id>
の
<meta attribute="field-description">
@hibernate.id
generator-class="Increment"
type="java.lang.Integer"
column="id"
</meta>
の部分は、コメントに使われるだけ、だと思う。
***MySQLのauto_incrementについて [#d1cfce68]
`name_id` int(10) unsigned NOT NULL auto_increment,
と定義されるカラムがあるテーブルについて、middlegenでJavaBeansとhbm.xmlファイルを作成したら以下のようになりました。
<id
name="nameId"
type="java.lang.Object"
column="name_id"
>
<meta attribute="field-description">
@hibernate.id
generator-class="assigned"
type="java.lang.Object"
column="name_id"
</meta>
<generator class="assigned" />
</id>
実際はIntegerとマッピングして欲しいのですが、うまくいかないですね。とりあえず自分でjava.lang.Integerに変更しました。あと
<generator class="assigned" />
を
<generator class="increment" />
に変更しました。もちろんJavaソースも作り直しました。
***複合キーを使ったテーブルのマッピング。 [#y6914635]
主キーが複数、たとえば
create table Customer3 (customer_id varchar(20) not null,
item_id varchar(20) not null,
value varchar(255),
upd_date timestamp,
primary key (customer_id, item_id));
というようにcustomer_id,item_idでユニークになるテーブルのマッピングについてです。
XDocletなどを使ってhbm.xmlを作る場合がほとんどだと思いますので、まずはPOJOから。結論を言うと、上の複合キーを一つのオブジェクトとするために一つPOJOを作ります。
public class Customer3Id implements Serializable {
private String customerId;
private String itemId;
public Customer3Id() {
}
/**
* @hibernate.property column = "customer_id" not-null = "true" length ="20"
*/
public String getCustomerId() {
return customerId;
}
/**
* @hibernate.property column = "item_id" not-null = "true" length = "20"
*/
public String getItemId() {
return itemId;
}
public String toString(){...}
public boolean equals(Object obj) {...}
public int hashCode() {...}
}
どうも、
-toString,equals,hashCodeは必ずOverrideしなくてはいけない
-implements Serializableであること
みたいです。
で、実際のレコードの方(?)のPOJOはさっきの複合オブジェクトを保持しておきます。
/**
* @hibernate.class table = customer3
*/
public class Customer3 {
private Customer3Id compositeId;
....
/**
* @return compositeId を戻します。
* @hibernate.id generator-class="assigned"
*/
public Customer3Id getCompositeId() {
return compositeId;
}
}
XDocletでhbmを生成したところ、
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>
<class
name="nu.mine.kino.plugin.hsqldb.hibernate.Customer3" >
<composite-id name="compositeId"
class="nu.mine.kino.plugin.hsqldb.hibernate.Customer3Id">
<key-property
name="customerId"
type="java.lang.String"
column="customer_id"
length="20"
/>
<key-property
name="itemId"
type="java.lang.String"
column="item_id"
length="20"
/>
</composite-id>
<property
name="value"
....................
</class>
</hibernate-mapping>
なんてのができあがりました。ポイントは複合キーはそのキーのオブジェクトを作る必要がある、ってことですかね。これ、結構めんどくさいね。
-[[複合識別子としてのコンポーネント:http://www.hibernate.org/hib_docs/reference/ja/html/components.html#components-compositeid]]
-[[Hibernate で O/Rマッピング してみる : 関係編:http://72.14.203.104/search?q=cache:HMzrczao5MkJ:xlegend.dip.jp/~hamasyou/archives/Engineer-Soul/hibernateoraoooiaiecuoeoeeeaoo.php+composite-id+Hibernate+XDoclet&hl=ja&gl=jp&ct=clnk&cd=2&lr=lang_ja]]
----
この記事は
#vote(おもしろかった,そうでもない)
#vote(おもしろかった[1],そうでもない[0])
-HQLの文法ってなかなかおぼえられん。 "from Messages as m order by m.messageText asc" といわれても。。。 -- [[きの]] &new{2006-06-18 21:33:13 (日)};
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}