programing

휴지 상태 주석의 @UniqueConstraint 및 @Column(Unique=true)

projobs 2022. 9. 15. 23:21
반응형

휴지 상태 주석의 @UniqueConstraint 및 @Column(Unique=true)

@UniqueConstraint @Column(Unique=true)의 차이점은 무엇입니까?

예를 들어 다음과 같습니다.

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)

그리고.

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;

아까도 말했지만@Column(unique = true)에의 숏컷입니다.UniqueConstraint단일 필드일 때.

당신이 제시한 예시로 볼 때, 두 가지 사이에는 큰 차이가 있습니다.

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;

이 코드는 다음 두 가지를 모두 의미합니다.mask그리고.group독특해야 하지만 따로 있어야 합니다.즉, 예를 들어 mask.id = 1인 레코드가 있고 mask.id = 1인 다른 레코드를 삽입하려고 하면 해당 열에 고유한 값이 있어야 하므로 오류가 발생합니다.그룹에 대해 동일한 Aplies.

반면에,

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)

mask + group combined 값이 고유해야 함을 나타냅니다.즉, 예를 들어 mask.id = 1group.id = 1인 레코드를 가질 수 있으며, mask.id = 1group.id = 2인 다른 레코드를 삽입하려고 하면 성공적으로 삽입되지만, 첫 번째 경우에는 삽입되지 않습니다.

마스크와 그룹을 개별적으로 고유하게 하고 클래스 수준에서 고유하게 하려면 다음과 같이 코드를 작성해야 합니다.

@Table(
        name = "product_serial_group_mask",
        uniqueConstraints = {
                @UniqueConstraint(columnNames = "mask"),
                @UniqueConstraint(columnNames = "group")
        }
)

이것은 첫 번째 코드 블록과 같은 효과를 발휘합니다.

Java EE 설명서:

public abstract boolean unique

(옵션)속성이 고유 키인지 여부입니다.이는 테이블 수준에서 UniqueConstraint 주석을 위한 바로 가기이며 고유한 키 제약 조건이 단일 필드일 때 유용합니다.이 제약조건은 프라이머리 키 매핑에 의해 수반되는 제약조건 및 테이블레벨로 지정된 제약조건에 더해서 적용됩니다.

문서 참조

보아즈의 대답에 덧붙여…

@UniqueConstraint를 사용하면 제약조건의 이름을 지정할 수 있습니다.@Column(unique = true)는 랜덤 이름을 생성합니다(예:UK_3u5h7y36qqa13y3mauc5xxayq).

제약조건이 관련되어 있는 테이블을 알면 도움이 될 수 있습니다.예:

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {
      @UniqueConstraint(
          columnNames = {"mask", "group"},
          name="uk_product_serial_group_mask"
      )
   }
)

@Boaz와 @vegemite4me의 답변 외에...

구현에 의해ImplicitNamingStrategy제약 조건을 자동으로 지정하는 규칙을 만들 수 있습니다.이름 지정 전략을 에 추가합니다.metadataBuilder최대 절전 모드 초기화 중:

metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());

효과가 있다@UniqueConstraint, 단, 용은 아닙니다.@Column(unique = true)는 항상 랜덤한 이름(예: UK_3u5h7y36qqa13y3mauc5xayq)을 생성합니다.

이 문제를 해결하기 위한 버그 리포트가 있으므로, 가능하다면 거기서 투표하여 실시해 주십시오.여기: https://hibernate.atlassian.net/browse/HHH-11586

감사합니다.

언급URL : https://stackoverflow.com/questions/15372654/uniqueconstraint-and-columnunique-true-in-hibernate-annotation

반응형