エンティティクラスとテーブル名

「@Tableでテーブル名を指定しなければクラス名がテーブル名になる」というは正確ではなないと言いたかったのですが、うまく説明できたようなできなかったような...。
ちょっとまとめてみます。エンティティクラスを作るときって、意識する名称が3つあるってことなのかなと思います。クラス名とエンティティ名とテーブル名です。これに関するConfiguration by Exceptionのルールは2つです。

  • エンティティ名が明示的に指定されない場合、エンティティ名はパッケージ名なしのクラス名と同じ
  • テーブル名が明示的に指定されない場合、テーブル名は(クラス名ではなく)エンティティ名と同じ

つまりパターンは4種類あります。

1.エンティティ名もテーブル名も明示的に指定されない場合

@Entity
public class Emp {
  //...
}

エンティティ名: Emp
テーブル名: EMP
クラス名: Emp


2.エンティティ名のみ明示的に指定される場合

@Entity(name = "Emp")
public class Employee {
  //...
}

エンティティ名: Emp
テーブル名: EMP
クラス名: Employee


3.テーブル名のみ明示的に指定される場合

@Entity
@Table(name="EMP")
public class Employee {
  //...
}

エンティティ名: Employee
テーブル名: EMP
クラス名: Employee


4.エンティティ名とテーブル名が明示的に指定される場合

@Entity(name="Hoge")
@Table(name="EMP")
public class Employee {
  //...
}

エンティティ名: Hoge
テーブル名: EMP
クラス名: Employee

EntityNotFoundExceptionにはThrowableを受け付けるコンストラクタがない

Java EE勉強会でThrowableなクラスにThrowableを受け付けるコンストラクタがないやつがあるという話がありました。実は下に出てきたEntityNotFoundExceptionもその1つ。
http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityNotFoundException.html

でも、Hibenateが使っているEntityNotFoundExceptionにはThrowableを受け付けるコンストラクタがあってHibernate内で実際に使われているんです。
http://www.hibernate.org/hib_docs/ejb3-api/javax/persistence/EntityNotFoundException.html

これって...。

S2Tigerにもjavax.persistenceパッケージのクラスを持っている(これはsunの方(JPA仕様)と同じ)のですが、S2Hibernate-JPAを使っているときに、先にS2Tigerの方のEntityNotFoundExceptionを読み込んでいると、Hibenateがこのコンストラクタを使おうとした時点でNoSuchMethodErrorが出ちゃうんですよね...

実はEntityNotFoundException以外にも、JPAで定義されているクラスとHibernateのjavax.persistenceに属するクラスで定義が違うものがいくつかあるのです。

Hibernateの3.2のfinalでちゃんとJPA仕様に合わせてくれるのでしょうか?というか合わせてくれないとまずいような気がします。

FlushModeType.COMMITでSELECTすると削除されたEntityが読めるのか?

Java EE勉強会で「FlushModeType.COMMITを指定してremovedなエンティティを読もうとしたら例外が起きるということが仕様書に書いてあったような...」と言ったのですが、言った後だんだん自信がなくなってきました。

ちょっとS2Hibernate-JPAを使って試してみました。

続きを読む

Mavenでのテスト通りました。

id:koichikさん、S2Hibernate-JPAMavenでテストが通らないというのはガセネタでした。すみません。m(_ _)m
ローカルのリポジトリ(.m2/repogitory)を一旦削除してテスト走らせたらOKでした。私の環境の問題だったようです。