Hibernate: применение уникальных членов данных - PullRequest
1 голос
/ 30 сентября 2011

У меня проблема с работой в Hibernate и принудительное использование уникальных элементов данных при вставке.

Вот мои сокращенные объекты Entity:

Рабочий процесс:

@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 голосов
/ 30 сентября 2011

Внутри моего объекта Workflow я поддерживаю набор сервисов.Каждая служба ведет список операций.Когда рабочий процесс сохраняется в базе данных, мне нужно проверить, есть ли службы и операции, которые он использует в данный момент, уже в базе данных, и если это так, связать себя с этими строками.думаю вы просите Hibernate обнаруживать дубликаты объектов при добавлении их в набор, да?Другими словами, когда вы помещаете объект в набор, вы хотите, чтобы Hibernate пошёл искать постоянную версию этого объекта и использовал ее.Однако Hibernate работает не так.Если вы хотите, чтобы он «повторно использовал» объект, вы должны найти его самостоятельно, а затем использовать его.Hibernate не делает этого.

Я бы предложил использовать вспомогательный метод для объекта, подобного DAO, который принимает родительский и дочерний объекты, а затем выполняет поиск и настройку за вас.

0 голосов
/ 30 сентября 2011

Уникальные или uniqueConstraints атрибуты не используются для обеспечения уникальности в БД, но создать правильный DDL, если вы создаете его из спящего режима (и для документации тоже, но это спорно).

1002 * Если вы объявляетечто-то уникальное в hibernate, вы должны объявить это тоже в DB, ​​добавив ограничение.

Принимая это до крайности, вы можете создать отображение, в котором PK не уникален в DB, ​​и hibernateвыдаст исключение, когда попытается загрузить один элемент, вызвав Session.load и неожиданно обнаружив, что есть 2 элемента.

...