Приложение на 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))
Я с хибернейтом как-то не очень знаком (совсем не знаком), но, насколько я могу судить, проблема где-то тут:
@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
из аннотации.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Планирую создать Android-приложениеЗнаю, что есть множество различных способов хранения информации
В литературе встречаются два разных понятия Инверсия управления и Принцип инверсии зависимостей, которые сформулированы одинакаво:
Читал книгу философия явадошёл к пункту: какя разница между одинарним и двойним использованием сивволов