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 Person및 Address. 엔티티를 생성하거나 업데이트하는 것은 엔티티 의 책임이 아니기 때문에 엔티티 의 엔티티 와 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

의 답변에 추가하고 싶습니다 BalusC 와 Pascal 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.