Поясніть, будь ласка, про inserttable = false та updatetable = false у посиланні на анотацію 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. Це навпаки.


Це стосується визначення insertable=false,updatable=falseоднієї зі сторін відносин.
BalusC

3
Ви говорите, що з оновленням = false у Person він відключить оновлення Person.name під час оновлення адреси (я не згоден, оскільки це є метою каскаду). Також ви говорите, що визначення @Column робить щось інше, коли його зовнішній ключ (Person) і коли він не є іноземним ключем (оскільки не існує посилання, що відключає оновлення). Читаючи javadoc для оновлення, я б сказав, що він просто вимкне змінити Person за вказаною адресою, якщо вона буде збережена один раз. Можете пояснити, будь ласка?
Flowy

8
Я думаю, ти мав намір сказати ... to the @ManyToOne relationship with the ...??
Мартін Конечний

111

Визначення insertable=false, updatable=falseє корисним, коли вам потрібно декілька разів відображати поле в суті, як правило:

Це ІМО не семантична річ, але, безумовно, технічна.


15
Я твердо вірю, що ця відповідь набагато краща за прийняту. Прийнята відповідь передає відчуття, що атрибут, який можна вставити / оновити, пов'язаний зі створенням / оновленням пов'язаної сутності, тоді як реальним наміром цих атрибутів є запобігання вставки / оновлення стовпця в поточну сутність. Створення / оновлення пов'язаної сутності вирішується атрибутом каскаду анотації на відображення.
Джаянт

25

Я хотів би додати до відповідей BalusC та Pascal Thivent ще одне поширене використання insertable=false, updatable=false:

Розглянемо стовпець, який не є ідентифікатором, а якимсь порядковим номером . Відповідальність за обчислення порядкового номера не обов'язково належить до програми.

Наприклад, порядковий номер починається з 1000 і повинен збільшуватися на одиницю для кожної нової сутності. Це легко зробити, і це дуже доречно, в базі даних, і в таких випадках ці конфігурації мають сенс.


1
послідовності підтримуються також JPA, так що ви можете визначити свою послідовність і з анотаціями JPA.
eis

8

Іншим прикладом може бути стовпець "created_on", де ви хочете дозволити базі даних обробляти дату створення


Чи повинен Hibernate блокувати оновлення на основі оновленої = помилкової примітки? У моєму тесті репозиторію JPA створений стовпець create_on з цією приміткою приймає оновлення без нарікань.
chrisinmtown

1
@chrisinmtown Eclipselink взагалі не буде включати стовпчик у sql. Я сподіваюся, що так само і зі
сплячкою
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.