Какая разница между аргументом name в @Entity и @Table при использовании JPA?
Я использую JPA2, и оба @Entity
и @Table
имеют атрибут name
, e. г:.
@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]
Ответы
Ответ 1
@Table является необязательным. @Entity необходимо для аннотации класса POJO как объекта, но атрибут name не является обязательным.
Если у вас есть класс
@Entity
class MyEntity {}
Будет создана таблица с именем " MyEntity", а имя Entity будет MyEntity. Ваш запрос JPQL будет выглядеть следующим образом:
select * from MyEntity
В JPQL вы всегда используете имя Entity и по умолчанию это имя класса.
если у вас есть класс
@Entity(name="MyEntityName")
@Table(name="MyEntityTableName")
class MyEntity {}
тогда создается таблица с именем MyEntityTableName и имя сущности MyEntityName.
Ваш запрос JPQL будет выглядеть следующим образом:
select * from MyEntityName
Ответ 2
имя в @Entity
для запросов JPA-QL, по умолчанию используется имя класса без пакета (или неквалифицированное имя класса в Java lingo), если вы его измените, вам нужно сделать убедитесь, что вы используете это имя при создании запросов.
имя в @Table
- это имя таблицы, в которой сохраняется этот объект.
Ответ 3
@Entity
полезен для классов моделей, чтобы обозначить, что это сущность или таблица
@Table
используется для указания любого конкретного имени вашей таблицы, если вы хотите указать любое другое имя
Примечание: если вы не используете @Table
, тогда hibernate считает, что @Entity
является вашим именем таблицы по умолчанию
@Entity
@Table(name = "emp")
public class Employee implements java.io.Serializable { }