JPA 주석으로 다중 열 제약 조건을 도입하는 방법은 무엇입니까?


91

JPA 매핑 된 엔터티에 다중 키 제약 조건을 도입하려고합니다.

public class InventoryItem {
    @Id
    private Long id;

    @Version 
    private Long version;

    @ManyToOne
    @JoinColumn("productId")
    private Product product;

    @Column(nullable=false);
    private long serial;
}

기본적으로 (제품, 직렬) 쌍은 고유해야하지만 직렬이 고유해야한다고 말하는 방법 만 찾았습니다. 다른 제품이 동일한 일련 번호를 가질 수 있기 때문에 이것은 분명히 좋은 생각이 아닙니다.

JPA를 통해이 제약 조건을 생성하는 방법이 있습니까? 아니면 DB에 수동으로 생성해야합니까?

답변:


190

@Table(uniqueConstraints = ...)엔티티 클래스 의 주석을 사용하여 고유 한 제약 조건을 선언 할 수 있습니다.

@Entity
@Table(uniqueConstraints={
    @UniqueConstraint(columnNames = {"productId", "serial"})
}) 
public class InventoryItem {
    ...
}

이것은 마술처럼 데이터베이스에 고유 한 제약 조건을 생성하는 것이 아니라 생성 할 DDL이 여전히 필요합니다. 그러나 JPA 엔티티 정의를 기반으로 데이터베이스를 생성하기 위해 일종의 자동화 도구를 사용하는 것 같습니다.


1
이미 제약이있는 기존 데이터베이스에 이런 종류의 것이 필요합니까?
Rob

JPA 공급자가 데이터베이스를 만드는 제약 조건이 만들어 질 것이라고 생각합니다.
AlanObject

고유성은 (productId) 열 및 (serial) 열 또는 총 2 열의 제약 조건 (productId, serial)입니까?
P Satish Patro

69

이미 답변했듯이 @Table주석을 사용하여 다중 열 색인을 추가 할 수 있습니다 . 그러나 columnNames클래스 속성이 아닌 실제 DB 열의 이름이어야합니다. 따라서 열이 다음과 같은 경우 :

@Column(name="product_id")
Long productId;

그러면 @Table주석은 다음과 같아야합니다.

@Table(uniqueConstraints=
       @UniqueConstraint(columnNames = {"product_id", "serial"}) 

10
이것은 객체 이름이 아니라 테이블 이름이라는 매우 중요한 설명입니다.
Calabacin 2017-06-30

1
고유성은 (productId) 열 및 (serial) 열 또는 총 2 열의 제약 조건 (productId, serial)입니까?
P Satish Patro

Kotlin : kotlin의 예를 찾으려면이 답변을 살펴보세요. stackoverflow.com/a/47000044/285431
Dirk

구문 오류. @Table 주석에 닫는 괄호가 없습니다.
Evvo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.