JPA @Column 주석을 참조하여 insertable = false 및 updatable = false에 대해 설명하십시오.


151

필드에 주석이 달린 경우 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;
}

답변:


121

문제의 관련 엔터티를 생성 / 업데이트 할 책임현재 엔터티에 없는 경우 그렇게 할 수 있습니다. 예를 들어 a PersonAddress. 엔티티를 생성하거나 업데이트하는 것은 엔티티 의 책임이 아니기 때문에 엔티티 의 엔티티 와 insertable=false, updatable=false@OneToMany관계 에 추가 하려고합니다 . 그것은 다른 길입니다.PersonAddressAddressPerson


insertable=false,updatable=false관계의 측면 중 하나 를 정의하는 것을 말합니다 .
BalusC

3
당신은 Person에 updatable = false를 사용하면 주소를 업데이트 할 때 Person.name의 업데이트를 비활성화 할 것이라고 말하고 있습니다 (캐스케이드의 목적에 동의하지 않습니다). 또한 @Column 정의는 외래 키 (Person)와 외래 키가 아닌 경우 (업데이트를 비활성화 할 참조 엔터티가 없으므로) 다르게 작동한다고 말합니다. 업데이트 할 수있는 javadoc을 읽으면 주어진 주소에 대해 Person을 한 번만 유지하면 변경하지 못하게됩니다. 설명해 주시겠습니까?
Flowy

8
나는 당신이 말하는 것을 의미한다고 생각합니까 ... to the @ManyToOne relationship with the ...??
Martin Konecny

111

정의 insertable=false, updatable=false는 일반적으로 엔티티에서 필드를 두 번 이상 맵핑해야 할 때 유용합니다.

이것은 의미론적인 것이 아니라 기술적 인 IMO입니다.


15
나는이 대답이 받아 들여진 것보다 훨씬 낫다고 믿는다. 허용되는 대답은 삽입 가능 / 업데이트 가능 속성이 관련 엔터티의 생성 / 업데이트와 관련이 있다는 느낌을 전달하는 반면, 이러한 속성의 진정한 의도는 현재 엔터티의 열 삽입 / 업데이트를 방지하는 것입니다. 관련 엔티티의 작성 / 업데이트는 맵핑 주석의 계단식 속성에 의해 처리됩니다.
Jayant

25

의 답변에 추가하고 싶습니다 BalusCPascal Thivent 다음 과 또 다른 일반적인 용도insertable=false, updatable=false .

ID는 아니지만 일련시퀀스 번호 인 열을 고려하십시오 . 시퀀스 번호를 계산하는 책임이 반드시 애플리케이션에 속할 필요는 없습니다.

예를 들어, 시퀀스 번호는 1000으로 시작하며 새 엔티티마다 하나씩 증가해야합니다. 이는 데이터베이스에서 쉽게 수행되며 매우 적절하게 수행되며 이러한 경우 이러한 구성이 의미가 있습니다.


1
JPA에서도 시퀀스를 지원하므로 JPA 주석으로 시퀀스를 정의 할 수도 있습니다.
es

8

다른 예는 데이터베이스가 날짜 작성을 처리하게하려는 "created_on"열에 있습니다.


최대 절전 모드는 updatable = false 주석을 기반으로 업데이트를 차단해야합니까? JPA 리포지토리 테스트에서이 주석이있는 created_on 열이 불만 사항없이 업데이트를 수락합니다.
chrisinmtown

1
@chrisinmtown Eclipselink는 SQL의 열을 전혀 포함하지 않습니다. 나는 그것이 최대 절전 모드와 동일하다고 기대합니다
Jaqen H'ghar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.