2011-09-30 3 views
1

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

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

Workflow:

@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)

но был нулевой удачи с ней.

Любая помощь будет принята с благодарностью

+0

В какой базе данных и диалекте вы используете? Как вы создали таблицы в своей базе данных? hbm2ddl? Можете ли вы показать запросы, используемые для создания вашей таблицы? Я не думаю, что hibernate когда-либо проверяет уникальность, но он должен генерировать таблицы с соответствующими уникальными ограничениями в вашей базе данных. –

ответ

0

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

Если вы объявляете что-то уникальное в спящем режиме, вы должны объявить его тоже в БД, добавив ограничение.

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

0

Внутри объекта Workflow я поддерживаю набор сервисов. Каждая Служба ведет список операций. Когда рабочий процесс сохраняется в базе данных, мне нужно, чтобы он проверял, находятся ли уже используемые службы и операции в базе данных, если это так, связать себя с этими строками.

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

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

+0

Вот что я сейчас работаю. Моя проблема в том, что Hibernate выдает ошибку, пытающуюся повторно добавить объект, и я получаю ошибку «дубликат ключа». Я использую 'session.saveOrUpdate (workflow) ', который хорош, однако я считаю, что это только для самого рабочего процесса, а не для его подэлементов. т.е. обслуживание и эксплуатация. ЛЮБЫЕ мысли? –

+0

Похоже, вы можете установить отдельные объекты в объект Workflow. Вам нужно получить под-объекты (по запросу, ID и т. Д.), А затем * в том же сеансе * добавить их в свой соответствующий набор и сохранить родительский объект. Пока ваш каскадный режим настроен правильно, Hibernate должен просто «делать правильную вещь» с под-объектами. Имеет ли это смысл? – Mac

Смежные вопросы