Как определить тип доступа по умолчанию для объектов JPA2

#java #hibernate #jpa

#java #переход в спящий режим #jpa

Вопрос:

Из-за некоторого странного поведения генератора метамодели Hibernate JPA 2 мне нужно установить тип доступа для всех моих объектов на AccessType.FIELD . — Поскольку я не хочу добавлять @Access аннотации к каждому классу, я прошу указать способ установки типа доступа по умолчанию.

До сих пор я пробовал это с помощью этого orm.xml :

 <?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
    http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
    version="2.0">

    <persistence-unit-metadata>
        <persistence-unit-defaults>
            <access>FIELD</access>
        </persistence-unit-defaults>        
    </persistence-unit-metadata>
  

Но это, похоже, игнорируется, генератор использует доступ к СВОЙСТВАМ по умолчанию.

Когда я добавляю эти строки в {{orm.xml }}:

 <access>FIELD</access>
<entity class="domain.Banner"></entity>
<entity class="domain.Stuff"></entity>
...
  

Генератор начинает уделять внимание полям (а не свойствам), но это еще хуже, чем способ аннотации.

Итак, мой вопрос: как установить тип доступа по умолчанию?

Комментарии:

1. Я использую Hibernate 3.6 с JPA 2.0 и в основном использую доступ к полю во всех своих объектах. Генератор метамодели не выявил никаких проблем. В чем именно заключается проблема, с которой вы сталкиваетесь с генератором метамодели?

2. @edalorzo: Я делаю то же самое в среде Spring Roo, и даже если у объекта нет аннотаций Roo, в режиме гибернации обращайте внимание только на свойства, но не на поля (за исключением случаев, когда я использую аннотацию @Access)

3. Вы помещаете аннотации JPA в поля или средства получения / установки? Если вы поместите их в getter / setters, JPA будет использовать тип доступа к свойству.

4. @Behrang Saeedzadeh: Аннотации находятся на полях. Но это приложение spring roo, и по какой-то причине поле / свойство автоматического обнаружения работает некорректно.

Ответ №1:

Удалось ли вам найти решение вашей проблемы? Я не уверен, поддерживают ли это hibernate и JPA, но вы можете использовать аннотации на уровне пакета. Вот пример определения типов из http://www.ctrlspace.ca/?p=10

 @TypeDefs({ @TypeDef(name = "trim", typeClass = TrimmedString.class) })  
@FilterDefs({  
@FilterDef(name = "ACTIVE_FILTER", defaultCondition = "((end_date is null) or (end_date >= current_date))"),  
@FilterDef(name = "HISTORICAL_FILTER", defaultCondition = "(end_date < current_date)")})  
package com.ctrlspace.model;  

import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.FilterDefs;  
import org.hibernate.annotations.TypeDef;  
import org.hibernate.annotations.TypeDefs;  

import com.ctrlspace.type.TrimmedString;