Пожалуйста, объясните о вставляемых = ложных и обновляемых = ложных в связи с аннотацией JPA @Column

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

Это можно сделать, когда ответственность за создание / обновление соответствующего объекта не входит в текущий объект. Например, у вас есть Personи Address. Вы хотели бы добавить insertable=false, updatable=falseв @OneToManyсвязи с Personорганизацией в Addressсущности, просто потому , что это не ответственность Addressлица , чтобы создать или обновить Person. Это наоборот.

BalusC
источник
Это относится к определению insertable=false,updatable=falseна одной из сторон отношений.
BalusC
3
Вы говорите, что с updatable = false на Person это отключит обновление Person.name при обновлении адреса (я не согласен, так как это является целью каскада). Также вы говорите, что определение @Column делает что-то другое, когда его внешний ключ (Person) и когда он не является внешним ключом (так как нет ссылочной сущности для отключения обновления). Читая javadoc для обновляемости, я бы сказал, что он просто отключит изменение Person для данного адреса, если он будет сохранен. Объясните пожалуйста?
текучий
8
Я думаю ты хотел сказать ... to the @ManyToOne relationship with the ...??
Мартин
112

Определение insertable=false, updatable=falseполезно, когда вам нужно отобразить поле в сущности более одного раза, обычно:

Это ИМО не семантическая вещь, а определенно техническая.

Паскаль Тивент
источник
15
Я твердо верю, что этот ответ намного лучше, чем принятый. Принятый ответ создает ощущение, что вставляемый / обновляемый атрибут связан с созданием / обновлением связанного объекта, тогда как реальная цель этих атрибутов состоит в том, чтобы предотвратить вставку / обновление столбца в текущем объекте. Создание / обновление связанной сущности решается с помощью каскадного атрибута аннотации сопоставления.
Jayant
26

Я хотел бы добавить к ответам BalusC и Pascal Thivent еще одно распространенное использование insertable=false, updatable=false:

Рассмотрим столбец, который не является идентификатором, а является своего рода порядковым номером . Ответственность за расчет порядкового номера может не обязательно принадлежать приложению.

Например, порядковый номер начинается с 1000 и должен увеличиваться на единицу для каждого нового объекта. Это легко сделать, и это очень уместно, в базе данных, и в таких случаях эти конфигурации имеют смысл.

Magnilex
источник
1
Последовательности также поддерживаются JPA, так что вы также можете определять свою последовательность с помощью аннотаций JPA.
эйс
9

Другим примером может быть столбец «create_on», в котором вы хотите, чтобы база данных обрабатывала дату создания

Johny19
источник
Должен ли Hibernate блокировать обновления на основе аннотации updatable = false? В моем тесте репозитория JPA столбец create_on с этой аннотацией принимает обновления без жалоб.
chrisinmtown
2
@chrisinmtown Eclipselink вообще не будет включать столбец в sql. Я ожидаю, что то же самое с Hibernate
Jaqen H'ghar