带有集合的Hibernate Annotations

blo*_*824 0 java collections configuration annotations hibernate

我正在尝试使用hibernate注释实现我的模型.我有3个班级,图像,人物和标签.标签是由4个字段组成的表,id,personId,imageId和createdDate.Person有字段名,id,birthdate等.我的图像类定义如下:

@Entity
@Table(name="Image")
public class Image {
    private Integer imageId;
    private  Set<Person> persons = new HashSet<Person>();

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    public Integer getImageId() {
        return imageId;
    }

    public void setImageId(Integer imageId) {
        this.imageId = imageId;
    }

    @ManyToMany
    @JoinTable(name="Tags",
                joinColumns = {@JoinColumn(name="imageId", nullable=false)},
                inverseJoinColumns = {@JoinColumn(name="personId", nullable=false)})
    public Set<Person> getPersons() {
        return persons;
    }

    public void setPersons(Set<Person> persons) {
        this.persons = persons;
    }
Run Code Online (Sandbox Code Playgroud)

如果我删除了getPersons()方法上的注释,我可以使用这些类并添加和删除记录.我想用图像获取所有标签,我正在尝试使用一组.我一直收到以下错误:

org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role: com.exmaple.persons, no session or session was closed
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我,让我知道我做错了什么?

谢谢

mat*_*t b 5

此错误消息 - 实际上与您的关联映射策略或注释无关 - 意味着您Session在关闭后尝试访问其中一个域对象上的延迟加载集合.

解决方案是为此集合禁用延迟加载,在Session关闭之前显式加载集合(例如,通过调用foo.getBars().size()),或确保在Session不再需要之前保持打开状态.

如果您不确定延迟加载是什么,请参阅Hibernate手册中的部分.