для чого потрібні анотації @Id та @GeneratedValue (стратегія = GenerationType.IDENTITY)? Чому тип покоління - це ідентичність?


83
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY)

Чому ми використовуємо ці анотації? мені потрібно знати, чи це автоматично збільшує значення ідентифікатора моєї таблиці. (GenerationType.IDENTITY) чи є якісь інші типи, що насправді відбувається, коли ми використовуємо цю анотацію

public class Author extends Domain
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id") 
    private Integer id;

    @Basic(optional = false)
    @Column(name = "name") 
    private String name;

    @Column(name = "address") 
    private String address; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "authorId")
    private List<Book>
    bookList;

    public Author()
    { 
        setServiceClassName("wawo.tutorial.service.admin.AuthorService");
    }
}

* Чи потрібно розширювати абстрактний клас домену? Яка користь?


Відповіді:


123

Дозвольте мені відповісти на це запитання:
Перш за все, використання анотацій як наш метод конфігурації - це просто зручний метод замість того, щоб впоратися з нескінченним конфігураційним файлом XML.

@IdАнотації успадковується від javax.persistence.Id, що вказує на поле члена нижче первинний ключ поточного об'єкта. Отже, ваш Hibernate та spring framework, а також ви можете робити деякі reflectроботи на основі цієї анотації. для деталей перевірте javadoc на наявність ідентифікатора

@GeneratedValueАнотації налаштувати спосіб збільшення заданого стовпчика (поля). Наприклад, під час використання Mysqlви можете вказати auto_incrementу визначенні таблиці, щоб зробити її самоінкрементною, а потім використовувати

@GeneratedValue(strategy = GenerationType.IDENTITY)

у коді Java для позначення того, що ви також визнали використання цієї стратегії на стороні сервера баз даних. Крім того, ви можете змінити значення цієї анотації відповідно до різних вимог.

1. Визначте послідовність у базі даних

Наприклад, Oracle повинен використовувати sequenceяк метод збільшення, скажімо, ми створюємо послідовність в Oracle:

create sequence oracle_seq;

2. Зверніться до послідовності бази даних

Тепер у нас є послідовність у базі даних, але нам потрібно встановити зв'язок між Java та DB, використовуючи @SequenceGenerator:

@SequenceGenerator(name="seq",sequenceName="oracle_seq")

sequenceNameсправжнє ім'я послідовності в Oracle, nameце те, що ви хочете назвати в Java. Вам потрібно вказати, sequenceNameчи він відрізняється від name, інакше просто використовуйте name. Зазвичай я ігнорую, sequenceNameщоб заощадити свій час.

3. Використовуйте послідовність у Java

Нарешті, настав час використовувати цю послідовність у Java. Просто додайте @GeneratedValue:

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")

generatorПоле відноситься до якій послідовності генератора ви хочете використовувати. Зверніть увагу, що це не справжнє ім'я послідовності в БД, а ім'я, яке ви вказали в nameполі SequenceGenerator.

4. Повна

Тож повна версія повинна бути такою:

public class MyTable
{
    @Id
    @SequenceGenerator(name="seq",sequenceName="oracle_seq")        
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")               
    private Integer pid;
}

Тепер почніть використовувати ці анотації, щоб полегшити розробку JavaWeb.


Належним синтаксисом анотації SequenceGenerator для Oracle 11.2 є @SequenceGenerator (name = "seq", sequenceName = "ORACLE_SEQ", allocationSize = 1). В іншому випадку без параметра allocationSize це дає дуже дивні генеровані результати (у моєму випадку негативні).
hariprasad

@hariprasad У моєму випадку, якщо я не встановлюю його, приріст становить 10. Але все-таки це необов'язковий параметр.
Rugal

Один із моїх знайомих сказав, що @Id призначений для унікальної ідентифікації. Якщо ви будете слідувати коду першим підходом, то це буде первинним ключем ще різниця. Ви можете пояснити вищезазначене речення?
P

@PSatishPatro Правильно, Id - це унікальний запис, звичайно. Але ми завжди будемо мати такі речі у визначенні таблиці, навіть для NoSQL
Ругаль

23

У контексті Реляційного відображення об’єктів кожен об’єкт повинен мати унікальний ідентифікатор. Ви використовуєте @Idанотацію, щоб вказати первинний ключ сутності.

@GeneratedValueАнотацій використовується для вказівки , як повинен бути сформований первинний ключ. У вашому прикладі ви використовуєте Identityстратегію, яка

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

Є й інші стратегії, ви можете побачити більше тут .


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

2
@ 404 Одна стратегічна база даних, яка використовується для генерації своїх первинних ключів, полягає у збереженні таблиці зі стовпцем (YMMV), де вони зберігають лише призначені ідентифікатори. Коли потрібно ввести новий рядок, буде сформовано та використано новий ідентифікатор, якого спочатку не було в таблиці.
Sotirios Delimanolis

1
так що автоматичне збільшення id це?
Lijo

1
@ 404 Я думаю, це залежить від бази даних. З MySQL це здається таким, але з іншими БД може бути інакше.
Sotirios Delimanolis

11
Simply, @Id: This annotation specifies the primary key of the entity. 

@GeneratedValue: This annotation is used to specify the primary key generation strategy to use. i.e Instructs database to generate a value for this field automatically. If the strategy is not specified by default AUTO will be used. 

GenerationType enum defines four strategies: 
1. Generation Type . TABLE, 
2. Generation Type. SEQUENCE,
3. Generation Type. IDENTITY   
4. Generation Type. AUTO

GenerationType.SEQUENCE

With this strategy, underlying persistence provider must use a database sequence to get the next unique primary key for the entities. 

GenerationType.TABLE

With this strategy, underlying persistence provider must use a database table to generate/keep the next unique primary key for the entities. 

GenerationType.IDENTITY
This GenerationType indicates that the persistence provider must assign primary keys for the entity using a database identity column. IDENTITY column is typically used in SQL Server. This special type column is populated internally by the table itself without using a separate sequence. If underlying database doesn't support IDENTITY column or some similar variant then the persistence provider can choose an alternative appropriate strategy. In this examples we are using H2 database which doesn't support IDENTITY column.

GenerationType.AUTO
This GenerationType indicates that the persistence provider should automatically pick an appropriate strategy for the particular database. This is the default GenerationType, i.e. if we just use @GeneratedValue annotation then this value of GenerationType will be used. 

Довідково: - https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/jpa-primary-key.html

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