在hibernate中,映射的究竟是什么意思?

时间:2012-05-31 03:19:45

标签: java hibernate one-to-many

我尝试了文档,但我什么都没有。我尝试在谷歌和stackoverflow上搜索它,但仍然没有帮助。我有一个单例类,这个类与另一个类有一个关系。这是我的代码。

@Entity
public class HomeLibrary extends BaseModelObject {
    @OneToMany(mappedBy = "homeLibrary", cascade = { CascadeType.ALL })
    private Collection<Book> books = new ArrayList<Book>();

    private static HomeLibrary sharedHomeLibrary = new HomeLibrary();

    public static HomeLibrary getSharedHomeLibrary() {
        return sharedHomeLibrary;
    }

    public Collection<Book> getBooks() {
        return books;
    }

    public void setBooks(Collection<Book> books) {
        this.books = books;
    }

    private HomeLibrary() {
    }
}

我在测试中遇到了错误。似乎无法构建表。

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [HibernateApplicationContext-aop.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne on edu.fudan.ss.persistence.hibernate.Book.homeLibrary references an unknown entity: edu.fudan.ss.persistence.hibernate.HomeLibrary

1 个答案:

答案 0 :(得分:0)

Hibernate需要存在默认构造函数才能创建实体,因为隐藏了构造函数,因此无法创建HomeEntity

构造函数应该是public或package visibility,hibernate应该能够使用setAccessible(true)//注意我还没有尝试过包可见性选项。

Hibernate以及创建实体的一般框架通过反射使用Class<T>.newInstance()

mappedBy意味着映射由Owning方完成,依赖方无需定义映射。

因此,如果您要在Book中定义映射,反之亦然,那么在您的情况下,您将在HomeLibrary中放置mappedBy。

关于SO的这个post讲的是通过Factory方法创建对象,你可以使用它来获得你的单例对象。