Hibernate:强制执行唯一数据成员

时间:2011-09-30 18:04:40

标签: java hibernate unique

我在使用Hibernate时遇到问题,并在插入时强制执行唯一数据成员。

以下是我删节的实体对象:

工作流:

@Entity
public class Workflow {

    private long wfId;

    private Set<Service> services;

    /** Getter/Setter for wfId */
    ...

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "workflow_services", 
        joinColumns = @JoinColumn(name = "workflow_id"), 
        inverseJoinColumns = @JoinColumn(name = "service_id"))
    public Set<Service> getServices() {
        return services;
    }

服务:

@Entity
public class Service {

    private long serviceId;
    private String serviceName;

    /** Getter/Setter for serviceId */
    ...

    @Column(unique=true,nullable=false)
    public String getServiceName() {
     return serviceName;
    }

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "service_operations", 
        joinColumns = { @JoinColumn(name = "serviceId") },
        inverseJoinColumns = { @JoinColumn(name = "operationId") })
    public Set<Operation> getOperations() {
        return operations;
    }

操作:

@Entity
public class Operation {

  private long operationId;
  private String operationName;

  /** Getter/Setter for operationId */

  @Column(unique=true,nullable=false)
  public String getOperationName() {
      return operationName;
  }

我的问题:

虽然我已经在每个对象中声明了什么是独特的,但它没有被强制执行。

在我的Workflow对象中,我维护了一组服务。每个服务都维护一个操作列表。当工作流保存到数据库时,我需要它来检查它当前使用的服务和操作是否已经在数据库中,如果是,则将它自己与这些行关联。

目前,我正在服务和运营表格中重复这些内容。

我尝试过使用注释:     @Table(uniqueConstraints)

但是运气不好。

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

unique或uniqueConstraints属性不用于强制DB中的唯一性,但如果从hibernate生成它,则创建正确的DDL(对于文档也是如此,但这是有争议的)。

如果你在hibernate中声明某些东西是唯一的,你应该在DB中通过添加约束来声明它。

将这种情况发挥到极致,您可以创建一个映射,其中PK在数据库中不是唯一的,并且当hibernate尝试通过调用Session.load来加载一个项目时会抛出异常,并且热情地发现它有2项。

答案 1 :(得分:0)

  

在我的Workflow对象中,我维护了一组服务。每个服务都维护一个操作列表。当工作流保存到数据库时,我需要它来检查它当前使用的服务和操作是否已经在数据库中,如果是,则将它自己与这些行关联。

认为你要求Hibernate在将它们添加到Set时检测重复的对象,是吗?换句话说,当你在Set中放置一个对象时,你希望Hibernate去寻找该对象的持久版本并使用它。但是,这不是Hibernate的工作方式。如果您希望它“重用”一个对象,您必须自己查找然后再使用它。 Hibernate没有这样做。

我建议在类似DAO的对象上使用辅助方法来获取父对象和子对象,然后为你进行查找和设置。