@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을 그 열이 고유 한 값을 가져야하기 때문에, 당신은 오류가 발생합니다. 그룹에도 동일하게 적용됩니다.
반면에
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
결합 된 마스크 + 그룹의 값이 고유해야 함을 의미합니다. 당신은 할 수있는 것을 의미한다, 예를 들어,와 기록 mask.id = 1 및 group.id = 1 , 당신과 다른 레코드를 삽입하려고하면 = 1 mask.id 및 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
Hibernate의 초기화 중에 이름 지정 전략을 추가합니다 .
metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());
항상 임의의 이름을 생성하는에서는 작동 @UniqueConstraint
하지만에서는 작동 하지 않습니다 @Column(unique = true)
(예 : UK_3u5h7y36qqa13y3mauc5xxayq).
이 문제를 해결하기위한 버그 보고서가 있으므로 가능하면 투표 하여이 문제를 구현하십시오. 여기 :
https://hibernate.atlassian.net/browse/HHH-11586
감사.