JPA @Column 주석을 참조하여 insertable=false 및 updateable=false에 대해 설명하십시오.
필드에 주석을 달 경우insertable=false, updatable=false
, 값을 삽입하거나 기존 값을 변경할 수 없다는 뜻이 아닌가?왜 그렇게 하고 싶으세요?
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy="person", cascade=CascadeType.ALL)
private List<Address> addresses;
}
@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name="ADDRESS_FK")
@Column(insertable=false, updatable=false)
private Person person;
}
참조된 열을 작성/업데이트하는 책임이 현재 도면요소가 아닌 다른 도면요소에 있는 경우 그렇게 할 수 있다.
정의insertable=false, updatable=false
일반적으로 다음과 같이 엔터티에서 필드를 두 번 이상 매핑해야 할 때 유용하다.
이것은 IMO가 의미론적인 것이 아니라 확실히 기술적인 것이다.
나는 BalusC와 Pascal Thivent의 또 다른 일반적인 용도의 대답을 덧붙이고 싶다.insertable=false, updatable=false
:
ID가 아닌 일종의 시퀀스 번호인 열을 생각해 보십시오.시퀀스 번호 계산에 대한 책임이 반드시 애플리케이션에 속하는 것은 아닐 수 있다.
예를 들어, 시퀀스 번호는 1000으로 시작하며 새로운 엔티티마다 하나씩 증가해야 한다.이것은 데이터베이스에서 쉽게 그리고 매우 적절하게 수행되며, 그러한 경우 이러한 구성이 타당하다.
다른 예는 "created_on" 열에 있으며, 여기서 데이터베이스에서 날짜 생성을 처리하도록 할 수 있다.
이전 답변에 추가, 일반적인 사용법insertable=false, updatable=false
중복 데이터베이스 쿼리를 저장하여 성능을 향상시키는 것이다.
상위 엔티티가 있는 클라이언트 클래스를 상상해 보십시오.클라이언트에 상위 항목이 있는지 확인하려면 해당 클라이언트의 값 존재 여부만 확인하십시오.parent_id
칼럼을 세우다최대 절전 모드에게 상위 엔티티를 가져오도록 요청할 필요가 없으며, 다른 모든 연결과 함께 다음과 같은 추가 쿼리 수가 발생할 수 있다.
public class Client {
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Parent parent;
@Column(name = "parent_id", insertable = false, updatable = false)
private UUID parentId;
}
위의 설정에서parentId
field는 단순히 에 저장된 모든 값을 가져온다.parent_id
지배기업이 단독으로 편집/업데이트하는 열.
나는 그것이 단순히 다음을 의미한다고 생각한다.
지속성 공급자가 생성한 SQL INSERT 문에 열이 포함되는지 여부.
참조: https://www.objectdb.com/api/java/jpa/Column
Javax의 지속성 설명서에 따르면:
지속성 공급자가 생성한 SQL UPDATE 문에 열이 포함되는지 여부.
이곳의 공식 문서로 이해하는 것이 가장 좋을 것이다.
또 다른 이유는 속성이 보기 열에 매퍼되기 때문일 수 있다(예: 최대 절전 모드 엔터티는 테이블과 보기의 융합이다).따라서 칼럼을 삽입할 수 있다는 느낌(또는 업데이트됨)이 들지 않는다.
@Entity
@Table(name = "THE_VIEW")
@SecondaryTable(name = "THE_TABLE", pkJoinColumns = @PrimaryKeyJoinColumn(name = "THE_ID"))
public class MyEntity {
@Id
@Column(name = "THE_ID")
private Integer id;
@Column(name = "VIEW_COLUMN", updatable = false, insertable = false)
private String viewColumn
@Column(name = "TABLE_COLUMN", table = "THE_TABLE")
private String tableColumn;
(여기서는 업데이트할 수 있는 보기에 대해 언급하지 않음)
'programing' 카테고리의 다른 글
C 코드의 오류 처리 (0) | 2022.04.14 |
---|---|
const char* 어레이 초기화 쉼표가 없는 경우 컴파일러 경고 생성 (0) | 2022.04.14 |
드롭다운 목록에서 확인란을 선택한 후 v-자동 완성(복수) 검색 입력을 지우는 방법 (0) | 2022.04.14 |
Java: 날짜 생성자가 더 이상 사용되지 않는 이유와 내가 대신 사용하는 것은? (0) | 2022.04.13 |
JUnit를 사용하여 비동기 프로세스를 테스트하는 방법 (0) | 2022.04.13 |