Уникальное ограничение, не созданное в JPA

Я создал следующий объектный компонент и указал два столбца как уникальные. Теперь моя проблема в том, что таблица создается без уникального ограничения и без ошибок в журнале. У кого-нибудь есть идея?

@Entity
@Table(name = "cm_blockList", uniqueConstraints = @UniqueConstraint(columnNames = {"terminal", "blockType"}))
public class BlockList {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="terminal")
    private Terminal terminal;
    @Enumerated(EnumType.STRING)
    private BlockType blockType;
    private String regEx;
}

person homaxto    schedule 31.05.2010    source источник
comment
Наш сервер - JBoss, поэтому я полагаю, что провайдер JPA находится в спящем режиме.   -  person homaxto    schedule 01.06.2010


Ответы (5)


Ну, я нашел другой способ сделать дизайн. Больше потому, что дизайн эволюционировал, чем обходной путь.
Однако я слышал от коллеги, у которого была та же проблема, что уникальные ограничения создаются только спящим режимом (мы используем JBoss 4.3) при создании всей базы данных. Это не сработает, если вы создадите новую таблицу в существующей базе данных.
Поэтому в файле persistence.xml необходимо установить hibernate.hbm2ddl.auto на create-drop, чтобы он работал. Я не могу подтвердить это, хотя.

person homaxto    schedule 09.06.2010
comment
homaxto ваше наблюдение верно. Я столкнулся с той же ситуацией, и ограничение работает, когда установлено create-drop. - person ; 15.05.2011
comment
У меня была такая же проблема, и воссоздание всей базы данных сработало - person greuze; 03.10.2011
comment
Я проверил это, воссоздав всю базу данных, используя все 3 варианта: update, create и create-drop, и ни один из трех вариантов не работал у меня. Логически также не имеет смысла заставлять его работать только с create-drop, а не с update и create. Мне кажется, что это ошибка в Hibernate. Но опять же мне интересно, почему эта ошибка до сих пор не решена к 2021 году (ошибка 10-летней давности ??). - person Yatendra; 09.01.2021

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

person Dima    schedule 01.09.2012

Больше предложений, чем реального ответа...

  • вы должны уточнить, какой поставщик JPA (и версию) вы используете для таких вопросов.

  • Я заметил, что один из ваших столбцов является частью ассоциации ManyToOne, это может быть «особый» случай, который не очень хорошо обрабатывается вашим поставщиком JPA. Под неумелым обращением я подразумеваю ошибку. Я бы проверил средство отслеживания проблем на наличие существующей проблемы (и, возможно, создал новую, ваш случай кажется совместимым с JPA).

person Pascal Thivent    schedule 31.05.2010

Если вам нужно уникальное ограничение, вы должны сделать это с помощью sql:

ALTER TABLE cm_blockList ADD CONSTRAINT cm_blockList_unq UNIQUE (terminal);

См. также: https://stackoverflow.com/a/3498242/1244488

person huangyp    schedule 09.04.2013

Я также столкнулся с той же проблемой, но добавление unique-key="UK1_test" в файл сопоставления сработало нормально.

<property name="hibernate.hbm2ddl.auto">create</property> с unique-key="UK1_test" unique="true" в файле сопоставления, созданном alter table employee add constraint UK1_test unique (addrId)

person Ritesh Kaushik    schedule 03.04.2014