@열(고유=true)이 작동하지 않는 것 같습니다.
속성을 다음과 같이 설정했는데도@Column(unique=true)
여전히 중복 항목을 삽입합니다.
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(unique=true )
private String name;
...
}
설정합니다.name
정규 사용EL
에JSF
안 했어요create
테이블 사용JPA
그unique=true
의 요소Column
주석 및/또는UniqueConstraint
테이블 수준에서 사용할 수 있는 주석은 생성된 DDL에 고유 제약 조건을 포함하도록 지정하는 데 사용됩니다.
즉, 런타임 중에는 아무것도 수행하지 않고 검증은 데이터베이스에 맡겨집니다(Java 수준에서1 유니시티를 안정적으로 테스트할 수 없음). 어떤 이유로든 데이터베이스 수준에서 해당 제약 조건을 정의하지 않으면 아무 일도 일어나지 않습니다.
제약 조건을 수동으로 추가합니다.
ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);
참고 항목
- JPA 1.0 규격
- 9.1.4 고유 구속조건 주석
- 9.1.5 열 주석
- MySQL 설명서
1 테이블 잠금(ouch!)을 획득하지 않으면 동시 환경에서 SQL 쿼리를 사용하여 단일성을 확인할 수 없습니다.
이 문제에 대해 비틀거리는 미래의 사용자를 위한 것입니다.여기에는 많은 훌륭한 제안들이 있습니다. 그것들과 오류 메시지를 읽어 보십시오. 그것들은 여러분의 문제를 해결하는 데 충분할 것입니다.
내가 얻으려는 탐구에서 얻은 몇 가지.@Column(unique=true)
일해.저의 경우 몇 가지 문제가 있었습니다(Spring Boot, FYI를 사용하고 있었습니다).커플 이름 지정하기
- 나의
application.properties
사용하고 있었습니다.spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
MySQL 8을 사용했음에도 불구하고, 저는 이것을 수정했습니다.spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
버전을 확인합니다(명령줄을 통해 이 작업을 수행했습니다).mysql> STATUS
). - 나는.
User
로 주석이 달린 수업.@entity
그것은 JPA가 그것을 만들기 위해 노력하고 있다는 것을 의미했습니다.user
MySQL의 예약된 키워드 중 하나인 테이블입니다.이걸로 고쳤어요.@Table(name = "users")
.
JPA를 사용하여 테이블을 만들지 않았습니다.
그런 다음 테이블에 고유 제약 조건을 추가해야 합니다.CREATE
예를 들어 MySQL을 사용하는 경우에는 다음과 같이 입력합니다.
create Customer (id int primary key, name varchar(255) unique);
InnoDB 테이블의 경우 인덱스된 열에 대한 제한이 있습니다.즉, te 필드의 최대 길이를 설정해야 합니다.
@Column(unique = true, length = 32)
private String name;
다음을 사용하여 클래스 수준에서 고유 제약 조건을 지정해 보십시오.
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
public class Customer {
...
private String name;
}
@Column(unique=true)은 사용할 수 없지만 클래스 수준에서 @UniqueConstraint를 사용했을 때 데이터베이스(MySql)의 열이 고유하게 설정되었습니다.
저는 이것이 미래에 이 같은 문제에 직면할 수 있는 다른 누군가에게 도움이 되기를 바랍니다.
저도 비슷한 문제에 직면했지만 해결되었습니다.
먼저 데이터베이스에서 테이블 삭제
drop table Customer;
스프링 부트 응용 프로그램을 중지하고 다시 시작합니다.
이것은 저에게 효과가 있었습니다.
테이블이 데이터베이스에 이미 있고 테이블이 기존의 고유하지 않은 레코드인 경우 jpa는 고유 제약 조건을 열로 설정하지 않습니다.솔루션:
- 중복된 레코드를 치료하거나 모든 레코드를 삭제합니다.
- 그런 다음 고유한 제약 조건을 설정합니다.
데이터베이스에서 최대 절전 모드로 만든 테이블을 삭제해야 합니다.그런 다음 최대 절전 모드 응용 프로그램을 다시 실행합니다.
MySQL 최대 절전 모드 개체 관계 매핑 - 스키마가 생성된 후의 변경 내용을 포함합니다.
엔티티 클래스를 변경하는 경우
[Customer]
최대 절전 모드에서 스키마를 생성한 후 스키마를 삭제하고 다시 생성할 수 있습니다.제약 조건이 적용됩니다.스키마를 삭제하는 대신 수동으로 테이블을 변경할 수 있습니다.
ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);
또한 모든 데이터베이스와 테이블이 이미 작성된 실행 중인 응용프로그램 중간에 유효성 검사를 추가한 경우에도 발생합니다.
@Column은 지속성 수준 주석이므로 필수 필드에 고유 제약 조건이 있을 때만 작동합니다.
필요한 주석을 모두 추가하고 모든 테이블을 삭제한 다음 응용 프로그램을 다시 실행합니다.이런 방식으로 응용 프로그램은 @Entity 주석으로 표시된 모든 테이블을 다시 만들고 '고유한' 제약 조건을 추가합니다.
모든 @Column 주석은 동일한 동작을 하므로 테이블을 반복적으로 삭제할 필요가 없도록 모든 필수 지속성 수준 검증을 헤드 앞에 추가하는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/3496028/columnunique-true-does-not-seem-to-work
'sourcetip' 카테고리의 다른 글
MYSQL의 하위 쿼리에서 LIMIT 키워드를 사용하는 대신 (0) | 2023.09.05 |
---|---|
SQL Create 문에서 명명된 외부 키 제약 조건 추가 (0) | 2023.09.05 |
Ubuntu Docker 이미지 내에서 wget을 실행하는 방법은 무엇입니까? (0) | 2023.09.05 |
윈도우즈 PowerShell에서 Node.js 환경 변수 전달 (0) | 2023.09.05 |
Angular를 사용하여 401s를 전 세계적으로 처리 (0) | 2023.09.05 |