Ошибка such unique or primary key already exists in the table при использовании jpa?

122
09 сентября 2019, 11:00

Приложение на sprign+jpa и базой oracle11g Настроен параметр генерации таблицы на основе предложенных сущностей JPA

properties.put("hibernate.hbm2ddl.auto", "create");

Код сущности, при создании таблицы из который возникает проблема:

import lombok.*;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.envers.Audited;
import javax.persistence.*;
@Entity
@Table(name = "UserRecord")
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor
@Getter
@Setter
@Access(AccessType.FIELD)
public class UserRecord {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "PR_KEY", unique = true)
    private String prKey;
    //Business Key
    @Column(name = "name", length = 100, unique = false)
    private String name;
    //surname Key
    @Column(name = "surname", length = 100, nullable = false)
    private String surname;
    //type Key
    @Column(name = "type", length = 100, nullable = false)
    private String type;
    //idPayment Key
    @Column(name = "idPayment", length = 64, nullable = false)
    private String idPayment;
    @Column(name = "User", length = 100000)
    @Lob
    private byte[] User;
    public UserRecord(String name, String surname, String type, byte[] User) {
        this.name = name;
        this.surname = surname;
        this.type = type;
        this.User = User;
    }
    public UserRecord(String name, String surname, String type,
                            String idPayment, byte[] User) {
        this.name = name;
        this.surname = surname;
        this.type = type;
        this.User = User;
        this.idPayment = idPayment;
    }
}

Здесь у меня prKey - это ключ в базе.
name, surname, type и idPayment - бизнес ключи, их комбинация должна быть уникальной внутри таблицы, но в плане бд это должны быть просто поля.

При попытке сгенерировать эту таблицу, получаю ошибку

 .SchemaExport perform ORA-02261: such unique or primary key already exists in the table jpa

при этом запрос в логах пытался выполниться такой:

 Hibernate: create table UserRecord (PR_KEY varchar2(255) not null unique, name varchar2(100), idPayment varchar2(64) not null, riskMetric blob, type varchar2(100) not null, surname varchar2(100) not null, version number(10,0) not null, primary key (PR_KEY), unique (name, surname, type, idPayment))
Answer 1

Я с хибернейтом как-то не очень знаком (совсем не знаком), но, насколько я могу судить, проблема где-то тут:

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "PR_KEY", unique = true)  // вот тут надо убрать unique
private String prKey;

Проблема в том, что в сгенерированном запросе

create table UserRecord (
  PR_KEY varchar2(255) not null unique, 
  name varchar2(100), 
  idPayment varchar2(64) not null, 
  riskMetric blob, 
  type varchar2(100) not null, 
  surname varchar2(100) not null, 
  version number(10,0) not null, 
  primary key (PR_KEY), 
  unique (name, surname, type, idPayment))

вы просите сделать дважды одно и то же. Оракл создает уникальный индекс и когда вы пишете PR_KEY varchar2(255) not null unique, и когда вы пишете primary key (PR_KEY). Вам нужно что-то одно, в данном случае убрать unique из описания поля - тогда запрос выполнится. Чтобы Hibernate сгенерировал его правильно, я подозреваю, достаточно убрать unique из аннотации.

READ ALSO
Хранение данных в Android-приложении

Хранение данных в Android-приложении

Планирую создать Android-приложениеЗнаю, что есть множество различных способов хранения информации

140
Чем инверсия управления (Inversion of Control, IoC) отличается от инверсии зависимостей (Dependency Inversion Principle, DIP)?

Чем инверсия управления (Inversion of Control, IoC) отличается от инверсии зависимостей (Dependency Inversion Principle, DIP)?

В литературе встречаются два разных понятия Инверсия управления и Принцип инверсии зависимостей, которые сформулированы одинакаво:

115
Данные из одного списка в другой

Данные из одного списка в другой

У меня есть список Arraylist list(с данными) и

148
В чем разница “&&” между “&” и “||” между “|” java?

В чем разница “&&” между “&” и “||” между “|” java?

Читал книгу философия явадошёл к пункту: какя разница между одинарним и двойним использованием сивволов

125