휴지 상태 주석의 @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 = 1 및 group.id = 1인 레코드를 가질 수 있으며, mask.id = 1 및 group.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
'programing' 카테고리의 다른 글
단일 값에 대해 여러 변수가 동일한지 검정하려면 어떻게 해야 합니까? (0) | 2022.09.18 |
---|---|
Java의 Scanner 클래스를 사용하여 콘솔에서 입력을 읽는 방법은 무엇입니까? (0) | 2022.09.18 |
Python에서 빈 목록 만들기 (0) | 2022.09.15 |
docker-param wordpress mysql 연결이 거부되었습니다. (0) | 2022.09.15 |
'가 뭐죠?YTowont9'? (0) | 2022.09.15 |