从JPA中的主表控制子实体

时间:2012-08-13 09:09:47

标签: hibernate orm jpa-2.0

假设我有以下实体

@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;
    }

}

其中Country类映射到预设的主表,不应修改。 用户可以在创建新origin时设置code的{​​{1}}。 如何检查提供的Item是否已经是主表中的条目?

如果我只是code新的persist()且不存在Item而未坚持该孩子,则会报告code。我是否只需要尝试捕获此异常以将其视为不存在的主数据?还是有更好的选择吗?

在实际案例中,org.hibernate.TransientObjectException对象中有很多这些子实体,我认为一个接一个地明确查找主数据并不是一个好主意。我认为这也不是一个好的解决方案。

1 个答案:

答案 0 :(得分:1)

任何解决方案都需要查看主表以查看Country是否已存在。这是一个问题,你是否明确地进行了这个调用,或者你要求你的框架(Hibernate)为你做这个。

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

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