ASi

JPA Facets の Generate Entities from Tables と EclipseLink の OR mapper

自動生成するEntity class 名が、DBのテーブル名が複数形の場合には単数になり、DBのテーブル名と異なることになるのだが、その時は @Table アノテーションでDBのテーブル名との関連付けが生成されるので問題ない。


問題は Entity 名と DBのテーブル名が同じの場合で、この時は @Table が生成されない。このままで動作させると、OR mapping の DB 側が upper case になってしまい、実際には小文字も含まれる DBのテーブルへのアクセスが失敗する。


Entity class に @Table を手動で付ければ当然動くのだが、そうすると Entity class を生成し直す度に手作業の修正が必要になってしまう。それは避けたい。


回避策として該当クラスだけ mapping-file を使用して定義することで解決できた。

persistence.xml

<persistence version="2.1" ~snip~>
    <persistence-unit name="Db" transaction-type="RESOURCE_LOCAL">
        <mapping-file>META-INF/orm.xml</mapping-file>
        <class>model.Train</class>
        <!-- <class>model.Car</class> define at orm.xml -->

orm.xml

<entity-mappings version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm
http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd">
	
    <entity name="Car" class="model.Car">
        <table name="Car"/> <!-- ←この要素が @Table 相当 -->
    </entity>
</entity-mappings>


もっとも、EclipseLink の OR mapper が @Table 指定なし時にはupper case 変換などせずにクラス名そのまま使ってSQLを発行してくれれば問題無いのだが…