【问题标题】:"cascading" a hibernate entity listener?“级联”一个休眠实体监听器?
【发布时间】:2010-02-25 10:07:48
【问题描述】:

使用休眠 3.2.4.sp1 我有两个实体 用户和联系人信息

一个User 有一个相关的ContactInfo,关系是单向的,即ContactInfo 不知道它所属的用户(也不应该在其他关系中重用它)

User 实体有一个实体侦听器,可防止实际用户本身以外的其他用户在数据库中更新它。这工作正常。问题是一个用户可以更新另一个用户ContactInfo。当用户级联ContactInfo 上的保存时,我想包括运行实体侦听器,这可能吗?

目前的关系

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Cascade( { org.hibernate.annotations.CascadeType.ALL,
        org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
@JoinColumn(name = "CONTACT_PERSON", nullable = false)
public ContactPerson getContactInfo() {
    return contactInfo;
}

public void setContactInfo(ContactPerson contactInfo) {
    this.contactInfo = contactInfo;
}

当前:实体监听器:

public class UserListener extends EntityListener {

    @PreUpdate
    @PrePersist
    @PreRemove
    public void checkWriteAuthorization(User user) throws IllegalUserAccessException {
        //access rules here
    }
}

我想我正在寻找类似“@PreCascadeChanges”的东西

实际的 store 调用总是在实体 User 上,更新被级联到 ContactInfo

【问题讨论】:

  • 嗨,我知道这是旧的......但你有没有找到解决方案?

标签: java hibernate orm jpa


【解决方案1】:

我想在从用户级联保存 ContactInfo 时包括运行实体侦听器,这可能吗?

我不认为是这样,因此您必须在回调 @PreUpdate@PrePersist@PreRemove 中执行您的检查,例如 User。如果你想检查一个实体是否“属于”某个用户,那么我猜你必须将这些信息存储在某个地方。就您而言,我不明白为什么您不能使 User-->ContactInfo 关联双向。你能澄清一下吗?

【讨论】:

  • 谢谢。我不想使关联是双向的,因为它也用于其他实体,例如公司可能有联系人。此外,它是一个遗留系统,所以我想避免太多的变化。我想我需要在持久化用户之前进行此检查,从而使侦听器变得多余。
【解决方案2】:

我遇到了同样的问题,通过让我的基实体类实现 Lifecycle 并在 onSave 方法中指定所需的行为来解决它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多