4

我正在尝试将 Hibernate 中的一对多/多对一关系与子实体列表映射。对其他关系的 Set 执行相同的操作可以找到,但我需要一个具有子实体顺序的列表。

到目前为止我所做的是:

@Entity
@Table(name="event")
public class Event {
    @OneToMany(mappedBy="event", fetch=FetchType.EAGER) 
    private List<Message> messages; //Message entitiy is the child
//getters+setters+and some other stuff like id
}

这是多对一的一面:

@Entity
@Table(name="message")
public class Message{
    @ManyToOne
    @JoinColumn(name="eventid")
    private Event event;
//getters+setters+and some other stuff like id
}

在此我可以插入一条消息,它将被添加到数据库(postgres)中。但是问题在于将消息作为列表获取:当仅添加一个并且在数据库中可见时,我得到同一消息的 2 个结果!

当然,我做了一些研究,发现 List 上需要一个索引。但是我没有尝试过,没有成功。我得到的只是一个例外:“集合的空索引列......”。我在这里和通过谷歌找到的解决方案似乎都不起作用,而且有很多“解决方案”,我真的不知道其中哪些甚至应该起作用!

有谁知道如何实现这种关系?如果有任何建议,我将不胜感激!

谢谢!

4

3 回答 3

3

我在使用@dan-torrey 和@peter-wippermann 提到的@OrderColumn 时也遇到了同样的问题,但在我的情况下,这个问题真的很微不足道。连接实体时,我忘记了一侧。例如。在上述情况下,我只完成了message.setEvent(event)而不是event.getMessages().add(message)。由于 Hibernate 的工作方式,它会在没有警告的情况下持久保存到数据库中,直到我稍后添加 @OrderColumn 时它才开始失败。

我知道最初的问题不包括@OrderColumn,但是只有当Hibernate实际使用索引列时才会出现上述错误消息..(也许OP以其他方式配置了这个..)

于 2019-01-18T12:36:15.940 回答
3

我对旧版本的休眠(3.5.6)有同样的问题,并找到了一个很好的非侵入性解决方法:尝试将你的更改List<Message>Set<Message>Object 并使用HashSet而不是ArrayList.

祝你好运!

于 2015-10-14T18:59:32.730 回答
1

我知道这是一个旧帖子,但我今天遇到了这个问题。

我通过在列表父级的 setter 方法上添加这些注释来解决它:

@OneToMany()
@OrderColumn( name = "LIST_ORDER" )
@Cascade( { CascadeType.SAVE_UPDATE, CascadeType.DELETE } )
@ForeignKey( name = "FK_..." )

我收到了异常,因为我的 OneToMany 注释中有一个“mappedBy”属性。

如果您还没有解决这个问题,也许这会有所帮助。

于 2013-10-04T20:02:06.337 回答