自動生成する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を発行してくれれば問題無いのだが…