Proszę wyjaśnić: insertable = false, updatable = false

Jeśli pole jest adnotowane insertable=false, updatable=false, czy nie oznacza to, że nie można wstawić wartości ani zmienić istniejącej wartości? Dlaczego chcesz to zrobić?

@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;
}
Author: Manuel Drieschmanns, 2010-09-27

4 answers

Zrobiłbyś to, gdy odpowiedzialnośćza tworzenie/aktualizowanie powiązanego podmiotu nie jest w bieżącym podmiocie. Np. masz Person i Address. Chcesz dodać {[2] } do @OneToMany relację z Person encją w encji Address, po prostu dlatego, że tworzenie lub aktualizacja Person nie jest obowiązkiem Address encji. Jest odwrotnie.

 87
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-24 10:52:06

Definiowanie insertable=false, updatable=false jest przydatne, gdy trzeba odwzorować pole więcej niż raz w encji, zazwyczaj:

To IMO nie jest rzecz semantyczna, ale na pewno techniczna.
 73
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-15 10:46:07

Chciałbym dodać do odpowiedzi BalusC i Pascal Thivent inne powszechne użycie insertable=false, updatable=false:

Rozważ kolumnę, która nie jest id , ale jakimś rodzajem numeru sekwencji. Odpowiedzialność za obliczenie numeru porządkowego niekoniecznie musi należeć do wniosku.

Na przykład, numer sekwencji zaczyna się od 1000 i powinien być zwiększany o jeden dla każdej nowej jednostki. Jest to łatwe i bardzo odpowiednie, w bazie danych, i w takich przypadkach te konfiguracje mają sens.

 17
Author: Magnilex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-23 09:03:13

Innym przykładem może być kolumna "created_on", w której chcesz, aby baza danych zajmowała się tworzeniem daty

 3
Author: Johny19,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 17:55:13