Java 使用集合休眠注释
我正在尝试使用hibernate注释实现我的模型。我有3个类,图像、人物和标签。标记是一个由4个字段组成的表,分别是id、personId、imageId和createdDate。Person具有字段名称、id、生日等。My image类的定义如下: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
@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).