Как вы решаете, в какие классы сущностей помещать аннотации JPA NamedQuery?
-
18-09-2019 - |
Вопрос
Допустим, у меня есть двунаправленная связь "один ко многим" между клиентом и CustomerOrder, причем CustomerOrder содержит общую стоимость каждого заказа.
Если бы у меня был запрос на поиск общей стоимости всех заказов для конкретного клиента :
select SUM(o.orderValue) from CustomerOrder o where o.customer = :customer
Имеет ли значение, в каком классе сущностей это аннотировано?Зачем вам вкладывать это в то или другое?
Решение
Имеет ли значение, в каком классе сущностей это аннотировано?
С технической точки зрения, это не имеет значения, поскольку вы будете использовать name
из a @NamedQuery
чтобы назвать это.
Зачем вам вкладывать это в то или другое?
Но, с "логической" точки зрения, помещая @NamedQuery
то, к чему относится "естественно", определенно облегчит обслуживание.В вашем примере я бы поместил запрос в CustomerOrder
сущность, потому что запрос является о поиске CustomerOrder
, это как раз то место, где я ожидал бы его найти, если бы мне пришлось его искать.
Другие советы
Это не имеет значения.Общий принцип заключается в том, чтобы поместить его туда, где ему логически место.В вашем случае - лучше бы это было в CustomerOrder
Поместите их в файлы сопоставления XML, которые должны быть объявлены в persistence.xml.Смотрите эту замечательную ссылку: arjan-tijms.omnifaces.org/2010/09/where-to-put-named-queries-in-jpa
Многие запросы "естественным образом" не относятся к сущности (и, кроме того, вам придется изменять код сущности, если вы их туда помещаете, каждый раз, когда вам нужен новый запрос).