Java Persistence / JPA: @Column vs @Basic

119

Jaka jest różnica między adnotacjami @Columni @Basicw JPA? Czy można ich używać razem? Czy powinny być używane razem? A może wystarczy jeden z nich?

Hosam Aly
źródło

Odpowiedzi:

147
  • @Basicoznacza, że ​​atrybut ma zostać utrwalony i ma zostać użyte standardowe mapowanie. Ma parametry, które pozwalają określić, czy atrybut ma być ładowany leniwie i czy dopuszcza wartość null.

  • @Column umożliwia określenie nazwy kolumny w bazie danych, w której atrybut ma zostać utrwalony.

Jeśli podasz jedno bez drugiego, otrzymasz domyślne zachowanie, które jest rozsądne, więc zwykle ludzie używają tylko jednego z wyjątkiem specjalnych przypadków.

Więc jeśli chcieliśmy leniwe ładowanie atrybutu i określić nazwę kolumny, możemy powiedzieć

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

Gdybyśmy potrzebowali domyślnego, nie leniwego zachowania, wystarczyłoby tylko @Columnto.

djna
źródło
2
To jest jasna odpowiedź. Dziękuję Ci. Zakładam więc, że można używać @Basicbez @Column, dlatego właściwości optionali nullableistnieją w obu. Czy mam rację?
Hosam Aly
1
Nie twierdzę, że w pełni rozumiem specyfikację JPA dotyczącą różnic między wartością nullable @ Basic a wartością nullable @ Column i skutkiem określenia żadnego, jednego lub obu. @Basic nullable jest opisywane jako „wskazówka” mająca znaczenie dla generowania schematu. Wartość null @Column jest opisana jako definiująca cechy kolumny w bazie danych. Moją praktyką byłoby użycie przypadku @Column.
djna
16
@Basic (opcjonalne) jest (powinno być) sprawdzane w czasie wykonywania przez dostawcę trwałości przed zapisaniem do bazy danych. @Column to definicja kolumny w bazie danych i służy do generowania schematu: stackoverflow.com/questions/2899073/…
Piotr Gwiazda
2
ten „nie leniwy”, nazywa EAGER. LOL
solwator
7
Adnotacje JPA można podzielić na dwie grupy: adnotacje czysto relacyjne oraz adnotacje implementacyjne. Czyste adnotacje relacyjne zawierają: Entity, Basic, OneToOne, OneToMany, ManyToMany, ... podczas gdy adnotacje dotyczące implementacji dają wskazówki, jak odwzorować czysty model teoretyczny na rzeczywistą bazę danych: Table, Column, ... W Twoim pytaniu „Basic 'to adnotacja dostarczająca informacji o atrybucie jednostki relacyjnej, podczas gdy' Kolumna 'dostarcza informacji o tym, jak odwzorować go na kolumnę bazy danych.
Bruno Ranschaert
50

Poza użytkownika @ djna odpowiedzi , warto zauważyć, że @Basicpowinny być porównywane z @OneToMany, @ManyToOnei @ManyToMany. W każdej właściwości można określić tylko jeden z nich.

@Columni @JoinColumnmożna je określić razem z dowolnymi z nich, aby opisać właściwości kolumny bazy danych.

Są to dwa zestawy adnotacji, których można używać razem, ale jednocześnie można używać tylko jednej adnotacji z każdego zestawu.

Hosam Aly
źródło
21

Warto zauważyć, że Basic jest przeznaczony dla pól prymitywnych

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

Atrybut podstawowy to taki, w którym klasa atrybutu jest typem prostym, takim jak String, Number, Date lub prymityw. Wartość atrybutu podstawowego może być odwzorowywana bezpośrednio na wartość kolumny w bazie danych.

Obsługiwane typy i konwersje zależą od implementacji JPA i platformy bazy danych. Każdy atrybut podstawowy korzystający z typu, który nie jest mapowany bezpośrednio na typ bazy danych, można serializować do binarnego typu bazy danych.

Najłatwiejszym sposobem zmapowania podstawowego atrybutu w JPA jest nic nie robić. Wszelkie atrybuty, które nie mają innych adnotacji i nie odwołują się do innych jednostek, zostaną automatycznie zamapowane jako podstawowe, a nawet serializowane, jeśli nie są typem podstawowym. Domyślna nazwa kolumny dla atrybutu, taka sama jak nazwa atrybutu, będzie pisana wielkimi literami.

Gadanina
źródło
Dobra notatka. Dziękuję Ci.
Hosam Aly
1
Nie, jeśli nie określono adnotacji kolumny, obowiązują wartości domyślne (nazwa będzie atrybutem jeden).
Gab
2

Adnotacje @Basic są stosowane do jednostek JPA, a atrybuty @Column są stosowane do kolumn bazy danych. Opcjonalny atrybut adnotacji @Basic określa, czy pole encji może mieć wartość null, czy nie; z drugiej strony,

  • Atrybut adnotacji @Column ma wartość null określa, czy odpowiednia kolumna bazy danych może mieć wartość null
  • Możemy użyć @Basic, aby wskazać, że pole powinno być ładowane leniwie
  • Adnotacja @Column pozwala nam określić nazwę zmapowanej kolumny bazy danych
  • Adnotacja @Basic oznacza, że ​​właściwość nie jest opcjonalna na poziomie obiektu Java. I (nullable = false) w mapowaniu kolumn jest odpowiedzialny tylko za generowanie ograniczenia bazy danych NOT NULL.
Sonu patel
źródło