Java 有没有办法抑制冬眠;具有给定标识符“的多行”;例外?

Java 有没有办法抑制冬眠;具有给定标识符“的多行”;例外?,java,hibernate,jpa,hibernateexception,Java,Hibernate,Jpa,Hibernateexception,在我们的域模型中,一个事件被设计为具有零或一个通知,因此我开始对实体关系使用@OneToOne注释: class Event { ... @OneToOne(mappedBy = "event") Notification notification; 在大多数情况下,它工作正常,但在极少数情况下,单个事件会出现重复的通知,其时间戳仅相差毫秒。如果发生这种情况,Hibernate将抛出一个异常: javax.persistence.PersistenceException:org

在我们的域模型中,一个
事件
被设计为具有零或一个
通知
,因此我开始对实体关系使用
@OneToOne
注释:

class Event {
...
    @OneToOne(mappedBy = "event")
    Notification notification;
在大多数情况下,它工作正常,但在极少数情况下,单个
事件
会出现重复的
通知
,其时间戳仅相差毫秒。如果发生这种情况,Hibernate将抛出一个异常:

javax.persistence.PersistenceException:org.hibernate.hibernateeException:找到多个具有给定标识符的行:1290338,用于类:Xxx

--整个结果集都失败了

我实现的解决方法是:将关系注释为
@OneToMany
,但通过getter返回单个
通知

@OneToMany(mappedBy = "event")
List<Notification> notifications;
...

public Notification getNotification() {
    return notifications == null || notifications.isEmpty()
           ? null : notifications.get(0);
}
@OneToMany(mappedBy=“event”)
列出通知;
...
公共通知getNotification(){
返回通知==null | | notifications.isEmpty()
?null:通知。获取(0);
}
它工作得很好,但我不喜欢这里的bean风格的类被破坏了。我的问题:是否有Hibernate首选项来抑制提到的异常,这样我就可以在没有自定义getter的情况下进行管理


数据库由外部系统管理和填充,因此无法添加约束或控制重复项的插入。

如何处理调用setNotification、刷新,然后让它返回与您刚才设置的不同的通知?如果多个通知映射到此事件,则它是1:M关系。您的应用程序可能只关心列表中的第一个通知,但可能并不总是如此。如何修复OneToOne映射上的“多个”错误:修复基础数据,因为如果一对一关系具有多个关系,则它显然已损坏。--或者关系不是一对一的,您需要更好地理解数据。@Andreas我完全理解数据已损坏,关系实际上不是一对一的(无论设计和规范如何)。但我不能影响,因为数据库是由另一个独立的系统管理的。如果数据不是一对一的,不要告诉hibernate是它。Hibernate做的是正确的,根据您告诉它的信息,它让您知道数据已损坏。当存在多个记录时,您必须决定需要哪个记录。Hibernate不能帮你这么做。Hibernate可以为您提供所有记录(一对多),您必须在代码中决定使用哪个记录。其他提供程序只需忽略多个结果并返回第一个结果。问题在于get(0)不能确保每次都获得相同的通知实例。排序会有所帮助,但如果另一个系统没有使用或填充您的关系为1:1,则意味着它实际上不是1:1。如何处理调用setNotification、刷新,然后让它返回不同的通知,然后您只需设置?如果多个通知映射到此事件,则它是1:M关系。您的应用程序可能只关心列表中的第一个通知,但可能并不总是如此。如何修复OneToOne映射上的“多个”错误:修复基础数据,因为如果一对一关系具有多个关系,则它显然已损坏。--或者关系不是一对一的,您需要更好地理解数据。@Andreas我完全理解数据已损坏,关系实际上不是一对一的(无论设计和规范如何)。但我不能影响,因为数据库是由另一个独立的系统管理的。如果数据不是一对一的,不要告诉hibernate是它。Hibernate做的是正确的,根据您告诉它的信息,它让您知道数据已损坏。当存在多个记录时,您必须决定需要哪个记录。Hibernate不能帮你这么做。Hibernate可以为您提供所有记录(一对多),您必须在代码中决定使用哪个记录。其他提供程序只需忽略多个结果并返回第一个结果。问题在于get(0)不能确保每次都获得相同的通知实例。排序会有所帮助,但如果另一个系统没有使用或填充您的关系为1:1,则表示它实际上不是1:1。