[java] 최대 절전 모드 주석의 @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을 그 열이 고유 한 값을 가져야하기 때문에, 당신은 오류가 발생합니다. 그룹에도 동일하게 적용됩니다.

반면에

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

결합 된 마스크 + 그룹의 값이 고유해야 함을 의미합니다. 당신은 할 수있는 것을 의미한다, 예를 들어,와 기록 mask.id = 1group.id = 1 , 당신과 다른 레코드를 삽입하려고하면 = 1 mask.idgroup.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제약 조건을 자동으로 명명하는 규칙을 만들 수 있습니다. metadataBuilderHibernate의 초기화 중에 이름 지정 전략을 추가합니다 .

metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());

항상 임의의 이름을 생성하는에서는 작동 @UniqueConstraint하지만에서는 작동 하지 않습니다 @Column(unique = true)(예 : UK_3u5h7y36qqa13y3mauc5xxayq).

이 문제를 해결하기위한 버그 보고서가 있으므로 가능하면 투표 하여이 문제를 구현하십시오. 여기 :
https://hibernate.atlassian.net/browse/HHH-11586

감사.


답변