Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用集合休眠注释_Java_Hibernate_Configuration_Collections_Annotations - Fatal编程技术网

Java 使用集合休眠注释

Java 使用集合休眠注释,java,hibernate,configuration,collections,annotations,Java,Hibernate,Configuration,Collections,Annotations,我正在尝试使用hibernate注释实现我的模型。我有3个类,图像、人物和标签。标记是一个由4个字段组成的表,分别是id、personId、imageId和createdDate。Person具有字段名称、id、生日等。My image类的定义如下: @Entity @Table(name="Image") public class Image { private Integer imageId; private Set<Person> persons = new

我正在尝试使用hibernate注释实现我的模型。我有3个类,图像、人物和标签。标记是一个由4个字段组成的表,分别是id、personId、imageId和createdDate。Person具有字段名称、id、生日等。My image类的定义如下:

@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;
    }
有人能帮我一下,让我知道我做错了什么吗


谢谢

此错误消息-实际上与您的关联映射策略或批注无关-表示您在关闭
会话
后尝试访问某个域对象上的延迟加载集合

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


如果您不确定延迟加载是什么,.

此错误消息-实际上与您的关联映射策略或注释无关-表示您在关闭
会话后试图访问一个域对象上的延迟加载集合

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


如果您不确定什么是延迟加载,。

感谢您的回复。我现在很困惑。检索图像的查询如下所示:

public Image findByImageId(Integer imageId) {
    @SuppressWarnings("unchecked")
    List<Image> images = hibernateTemplate.find(
            "from Image where imageId=?", imageId);
    return (Image)images.get(0);
}
公共图像findByImageId(整数imageId){
@抑制警告(“未选中”)
列表图像=hibernateTemplate.find(
“来自图像,其中imageId=?”,imageId);
返回(图像)图像。获取(0);
}
我认为我可以调用单个hql查询,如果我的映射正确,它将返回关联的数据

我在这个链接上看到了这个例子:

2.2.5.3.1.3。单向连接表
最好使用带有联接表的单向一对多。此关联通过@JoinTable进行描述。
@实体
公共课堂培训师{
@独身癖
@可接合(
name=“TrainedMonkeys”,
joinColumns=@JoinColumn(name=“trainer\u id”),
inverseJoinColumns=@JoinColumn(name=“monkey\u id”)
)
公共集getTrainedMonkeys(){
...
}
@实体
公营猴子{
…//没有比迪尔
}Trainer使用联接表TrainedMonkeys描述与Monkey的单向关系,外键Trainer\u id为Trainer(joinColumns),外键Monkey\u id为Monkey(inversejoinColumns)。

感谢matt的回复。我现在很困惑。检索图像的查询如下所示:

public Image findByImageId(Integer imageId) {
    @SuppressWarnings("unchecked")
    List<Image> images = hibernateTemplate.find(
            "from Image where imageId=?", imageId);
    return (Image)images.get(0);
}
公共图像findByImageId(整数imageId){
@抑制警告(“未选中”)
列表图像=hibernateTemplate.find(
“来自图像,其中imageId=?”,imageId);
返回(图像)图像。获取(0);
}
我认为我可以调用单个hql查询,如果我的映射正确,它将返回关联的数据

我在这个链接上看到了这个例子:

2.2.5.3.1.3.带联接表的单向
最好使用带有联接表的单向一对多。这种关联通过@JoinTable来描述。
@实体
公共课堂培训师{
@独身癖
@可接合(
name=“TrainedMonkeys”,
joinColumns=@JoinColumn(name=“trainer\u id”),
inverseJoinColumns=@JoinColumn(name=“monkey\u id”)
)
公共集getTrainedMonkeys(){
...
}
@实体
公营猴子{
…//没有比迪尔
}Trainer使用联接表TrainedMonkeys描述与Monkey的单向关系,外键Trainer\u id为Trainer(joinColumns),外键Monkey\u id为Monkey(inversejoinColumns)。

有人对我的后续问题有任何其他意见吗?谢谢我不确定我是否理解你在这里提出的问题,但是你查询返回第一个
图像
实例实际上会返回对象-但是Hibernate懒得加载
图像.trainers
集合,错误消息指的是这个集合。This是在关闭会话之前必须加载的集合,或者标记为非延迟加载。我想这就是我感到困惑的地方。因此,我的查询捕获了具有延迟加载集的图像对象。因此,当我请求特定图像对象时,它基本上是一个空集?我相信,因为我使用的是hibernateTemplate,所以会话是为我处理的。所以当我执行hibernate.find(“从图像…),我必须对person对象进行另一次查找并填充该集合?如果您使用的是Spring,请查看手册中与相关的部分。如果不存在会话,HibernateTemplate将打开会话,如果您的方法调用在事务中,则使用现有会话。您将收到一个错误,因为您是在t之后访问该集合的会话已关闭,这可能是在方法调用后自动完成的。有人对我的后续问题有任何其他评论吗?谢谢,我不确定我是否理解您在这里提出的问题,但您返回第一个
图像
实例的查询实际上会返回对象-但是Hibernate懒散地加载
Image.trainers
collection,错误消息所指的集合。这是您必须在关闭会话之前加载的集合,或标记为非延迟加载的集合。我想这正是我感到困惑的地方。因此,我的查询捕获了具有延迟加载集合的图像对象。因此,当我请求特定ima时,它基本上是一个空集ge对象?我相信因为我使用的是hibernateTemplate,所以会话是为我处理的。所以当我执行hibernate.find时(
2.2.5.3.1.3. Unidirectional with join table
A unidirectional one to many with join table is much preferred. This association is described through an @JoinTable.

@Entity
public class Trainer {
    @OneToMany
    @JoinTable(
            name="TrainedMonkeys",
            joinColumns = @JoinColumn( name="trainer_id"),
            inverseJoinColumns = @JoinColumn( name="monkey_id")
    )
    public Set<Monkey> getTrainedMonkeys() {
    ...
}

@Entity
public class Monkey {
    ... //no bidir
}         Trainer describes a unidirectional relationship with Monkey using the join table TrainedMonkeys, with a foreign key trainer_id to Trainer (joinColumns) and a foreign key monkey_id to Monkey (inversejoinColumns).