@Relation、N側のカラムがNULLの時
例えばBookエンティティとBookUserエンティティにN:1の関連がある場合、
@Bean(table="BOOK") public class Book { private Integer pkey; // 主キー private String bookLabel; // 本名 private Integer fkey; // 外部キー private BookUser bookUser; // BookUser : @Relation(relationNo=0, relationKey="fkey:userId") public void setBookUser(BookUser bookUser) { // ・・・ } } @Bean(table="BOOK_USER") public class BookUser { private Integer userId; // 主キー private String name; // 名前 : }
というようにBookエンティティにBookUserを定義して、
setterに@RelationでBookエンティティのfkeyとBookUserエンティティのuserIdを
関連付けてあげれば、N:1のマッピングが完成。。。なのですが、
ちょっとはまっているのが、N側の値がNULLの場合です。
N側(Book)のfkeyは外部キーなのでNULLが入る場合もあります。
その場合に、Book側のBookUserオブジェクトもNULLが入ってくれればいいのですが、
BookUserがNewされた状態?で返ってきてしまうのです。
具体的に言うと下記のようなデータの場合で、BookエンティティのPKEYが"3"を参照した場合です。。。
PKEY | BOOK_LABEL | FKEY |
---|---|---|
1 | ブック1 | 1 |
2 | ブック2 | 2 |
3 | ブック3 | NULL |
USER_ID | NAME |
---|---|
1 | タロ |
2 | ジロ |
public interface BookDao { @Arguments("PKEY") public Book findByPrimaryKey(int pkey); : } public class Execute { : public BookDao bookDao; : Book book = bookDao.findByPrimaryKey(3); System.out.println("Book主キー :" + book.getPkey); System.out.println("Bookラベル :" + book.getBookLabel); System.out.println("Book外部キー:" + book.getFkey); if(book.getBookUser == null) { Syste.out.println("BookUserはNULLです"); } else { Syste.out.println("BookUserはNULLではナイデス..."); } } 実行結果 Book主キー :3 Bookラベル :ブック3 Book外部キー:NULL BookUserはNULLではナイデス...
Bookエンティティのfkeyは当然NULLが返ってくるのですが、
BookUserに生成されたインスタンスが代入されてしまうのは仕様なのでしょうか?
個人的な見解ですと、関連付けたfkeyに対するuserIdが見つからなかった場合、
Bookエンティティ側に定義してあるBookUserエンティティもNULLになっている方が
しっくりするのになぁと思っているのですが...(それともタダ間違っているだけなのか...)