Hibernate の Annotation を試しているときに @OneToMany でつまったのでメモ。
【やりたいこと】
Projectクラスと、Memberクラスを用意して、
Project の中に Member を ArrayList で沢山保持したい。
で、作った Project.java を下に載せる。
[model.Project.java] package model; import java.util.ArrayList; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity @Table public class Project { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer id; @Column private String name; @OneToMany private ArrayList members = new ArrayList(); private Project() {} public Project(String name){ this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ArrayList getMembers() { return members; } public void addMember(Member member) { this.members.add(member); } }
【問題】
@OneToMany private ArrayList members = new ArrayList();
というフィールドを作ったら以下のように怒られた。
Exception in thread "main" java.lang.ExceptionInInitializerError at TestMain.HibernateUtil.(HibernateUtil.java:14) at TestMain.AddMember.main(AddMember.java:11) Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: model.Project.members at org.hibernate.cfg.annotations.CollectionBinder.getCollectionBinder(CollectionBinder.java:266) at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1448) at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:754) at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:546) at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:291) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1333) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) at TestMain.HibernateUtil.(HibernateUtil.java:12) ... 1 more
【解決方】
原因は、フィールドの型は List でないといけないらしい。
Hibernate Annotations Reference Guideより
Collection、List(インデックス化 リストではなく、順序化リスト)、Map、及び Set を マップすることができます。
とのこと。
と、いうことで、
@OneToMany private List members = new ArrayList();
にしたら、ちゃんと保存できました。 よかったよかった。