1

假设我有以下实体

@Entity
public class Item{

    private Country origin;

    @ManyToOne(optional=true)
    @JoinColumn(name="origin")
    public Country getOrigin() {
        return this.origin;
    }

}

@Entity
public class Country{

    private String code;
    private String desc;

    @Id
    public String getCode() {
        return this.code;
    }

    @Column
    public String getDesc() {
        return this.desc;
    }

}

其中Countryclass 映射到预设的主表,不应修改。用户可以在创建新origin的. 如何检查提供的是否已经是主表中的条目?codeItemcode

如果我只是persist()一个新Item的带有一个code不存在而没有坚持的孩子,一个org.hibernate.TransientObjectException将被报告。我是否只需要尝试捕获此异常以将其视为不存在的主数据?或者有没有更好的选择?

在实际情况下,对象中有很多这些子实体Item,我认为明确地逐个查找主数据不是一个好主意。而且我认为这也不是一个好的解决方案。

4

1 回答 1

1

任何解决方案都需要查看主表以查看是否Country已经存在。这是您是否明确地进行此调用,或者您要求您的框架(Hibernate)为您执行此操作的问题。

Country如果您知道Item不能依赖创建的源/输入,我会明确并根据表验证数据。如果您有一个您可以严格控制的 GUI,那么这个错误可能永远不会发生,因为您应该只为用户提供确实存在的有效选项。同样通过明确,如果您知道由于数据不可靠而必须在持久化之前进行检查,则可以编写单元测试以包含此显式检查。

请记住,Hibernate 会将您的查询缓存到 Country 表中,因此我不认为它会影响您的应用程序的性能。

于 2012-08-13T11:04:24.150 回答