sourcetip

@열(고유=true)이 작동하지 않는 것 같습니다.

fileupload 2023. 9. 5. 20:43
반응형

@열(고유=true)이 작동하지 않는 것 같습니다.

속성을 다음과 같이 설정했는데도@Column(unique=true)여전히 중복 항목을 삽입합니다.

@Entity
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(unique=true )
    private String name;

    ...
}

설정합니다.name정규 사용ELJSF안 했어요create테이블 사용JPA

unique=true의 요소Column주석 및/또는UniqueConstraint테이블 수준에서 사용할 수 있는 주석은 생성된 DDL에 고유 제약 조건을 포함하도록 지정하는 데 사용됩니다.

즉, 런타임 중에는 아무것도 수행하지 않고 검증은 데이터베이스에 맡겨집니다(Java 수준에서1 유니시티를 안정적으로 테스트할 수 없음). 어떤 이유로든 데이터베이스 수준에서 해당 제약 조건을 정의하지 않으면 아무 일도 일어나지 않습니다.

제약 조건을 수동으로 추가합니다.

ALTER TABLE Customer ADD CONSTRAINT customer_name_unq UNIQUE (name);

참고 항목

1 테이블 잠금(ouch!)을 획득하지 않으면 동시 환경에서 SQL 쿼리를 사용하여 단일성을 확인할 수 없습니다.

이 문제에 대해 비틀거리는 미래의 사용자를 위한 것입니다.여기에는 많은 훌륭한 제안들이 있습니다. 그것들과 오류 메시지를 읽어 보십시오. 그것들은 여러분의 문제를 해결하는 데 충분할 것입니다.

내가 얻으려는 탐구에서 얻은 몇 가지.@Column(unique=true)일해.저의 경우 몇 가지 문제가 있었습니다(Spring Boot, FYI를 사용하고 있었습니다).커플 이름 지정하기

  • 나의application.properties사용하고 있었습니다.spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5DialectMySQL 8을 사용했음에도 불구하고, 저는 이것을 수정했습니다.spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect버전을 확인합니다(명령줄을 통해 이 작업을 수행했습니다).mysql> STATUS).
  • 나는.User로 주석이 달린 수업.@entity그것은 JPA가 그것을 만들기 위해 노력하고 있다는 것을 의미했습니다.userMySQL의 예약된 키워드 중 하나인 테이블입니다.이걸로 고쳤어요.@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는 고유 제약 조건을 열로 설정하지 않습니다.솔루션:

  1. 중복된 레코드를 치료하거나 모든 레코드를 삭제합니다.
  2. 그런 다음 고유한 제약 조건을 설정합니다.

데이터베이스에서 최대 절전 모드로 만든 테이블을 삭제해야 합니다.그런 다음 최대 절전 모드 응용 프로그램을 다시 실행합니다.

MySQL 최대 절전 모드 개체 관계 매핑 - 스키마가 생성된 후의 변경 내용을 포함합니다.

  1. 엔티티 클래스를 변경하는 경우[Customer]최대 절전 모드에서 스키마를 생성한 후 스키마를 삭제하고 다시 생성할 수 있습니다.제약 조건이 적용됩니다.

  2. 스키마를 삭제하는 대신 수동으로 테이블을 변경할 수 있습니다.

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

반응형