В чем разница между аргументом name в @Entity и @Table при использовании JPA? - PullRequest
50 голосов
/ 31 августа 2011

Я использую JPA2, и оба @Entity и @Table имеют атрибут name, например:

@Entity(name="Foo")
@Table (name="Bar")
class Baz

Что я должен использовать, какие из них являются дополнительными?

В моем конкретном случае у меня есть класс User и класс Group, у которых есть дополнительные требования (насколько я понимаю), потому что они являются зарезервированными словами в SQL.

Какбудет выглядеть рабочее решение и под каким именем я буду ссылаться на сущность при написании запросов?

Обновлено.Я добавил name="GROUPS" к обоим аннотациям в Group и сделал то же самое для User, но теперь я получаю эту ошибку:

Exception Description: The table [USERS] is not present in this descriptor.
Descriptor: RelationalDescriptor(example.Group --> [DatabaseTable(GROUPS)])

и

Internal Exception: java.sql.SQLException: Table not found in statement [SELECT ID, MAXIMUMROLE, MEMBERSHIPS_ID FROM USERS]

Ответы [ 3 ]

79 голосов
/ 31 августа 2011

@ Таблица необязательна. @Entity необходим для аннотирования класса POJO как объекта, но атрибут name не является обязательным.

Если у вас есть класс

 @Entity
 class MyEntity {}

Будет создана таблица с именем « MyEntity », а именем сущности будет MyEntity . Ваш запрос JPQL будет:

 select * from MyEntity

В JPQL вы всегда используете имя сущности, и по умолчанию это имя класса.

если у вас есть класс

 @Entity(name="MyEntityName")
 @Table(name="MyEntityTableName")
 class MyEntity {}

затем создается таблица с именем MyEntityTableName и именем объекта является MyEntityName .

Ваш запрос JPQL будет:

 select * from MyEntityName
25 голосов
/ 31 августа 2011

Имя в @Entity предназначено для запросов JPA-QL, по умолчанию используется имя класса без пакета (или неквалифицированное имя класса в жаргоне Java), если вы его измените, убедитесь, что вы используете это имя при построении запросов.

Имя в @Table - это имя таблицы, в которой сохранен этот объект.

1 голос
/ 15 октября 2016

@Entity полезно для классов моделей, чтобы обозначить, что это сущность или таблица.

@Table используется для предоставления любого конкретного имени вашей таблице, если вы хотите указать другое имя

Примечание: если вы не используете @Table, то hibernate считает, что @Entity - это имя вашей таблицы по умолчанию

@Entity    
@Table(name = "emp")     
public class Employee implements java.io.Serializable { }
...