JPAとアクセッサメソッドの関係

実はこいつフィールドインジェクションだったワケ?
「リードオンリーなエンティティってどうやって作るんだろう」と思い,ミューテータなしのエンティティ作って試してみた.

@Entity
public class Shohin implements Serializable {
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id private int id;

    private String shohinName;
    private int price;

    public Shohin() {}

    public Shohin(String name, int value) {
        shohinName = name;
        price = value;
    }

    public int getId() { return this.id; }
    public String getShohinName() { return shohinName; }
    public int getPrice() { return price; }
}

んで,こんなコードで検索と登録してみんとす.

    @PersistenceContext(unitName="hello_ds")
    private EntityManager em;

    public List getShohins() {
        Query q = em.createQuery("select d from Shohin d");
        return q.getResultList();
    }

    public void insert() {
        Shohin shohin = new Shohin("デジカメ", 500);
        em.persist(shohin);
    }

意外なことにできるんだなー,コレが.
さすがにアクセッサも無くしちゃうとJSFにバインドできないから残しとく.


アクセサメソッドがないとダメってのは,単なる思いこみだったようだ.ちなみに,非永続にしたい場合は,@Transientアノテーションを付けるといいらしい.

    private String shohinName;
    @Transient private int price;

すごいね,JPA
#ってナニが?