JPA 2 XML Mapping для Embedded, чтобы он работал с генератором мета-модели Hibernate - PullRequest
7 голосов
/ 01 июня 2011

Я хочу использовать генератор мета-моделей JPA 2 для Hibernate (версия 1.1.1-Final) (в приложении Spring). Поскольку я использую Mapped Superclass, который является основой для всех сущностей, и этот класс находится в другом банке (для повторного использования), мне нужно отобразить этот класс явным образом в XML (только для генерации метамодели, потому что он работает без каких-либо дополнительных вещей вовремя) --- Может у кого-нибудь есть подсказка, как решить это вообще, но это не вопрос.

Этот сопоставленный суперкласс (BusinessEntity) использует встроенный класс (BusinessId).

@SuppressWarnings("serial")
@MappedSuperclass
public abstract class BusinessEntity<T extends Serializable>
                      implements Serializable {
   @Id    
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "id")
   private Long id;

   @Embedded
   private BusinessId<T> businessId;
 ...
}


@Embeddable
public class BusinessId<T> implements Serializable {
    @Column(nullable = false, unique = true, name = "businessId")
    private long businessId;
  ...
}

Но я не получаю отображение, работающее вместе с Генератором: Если я использую это 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">

    <mapped-superclass class="BusinessEntity"  
            access="FIELD">     
        <attributes>            
            <id name="id">
                <column nullable="false"/>
                <generated-value strategy="AUTO"/>              
            </id>
            <embedded name="businessId"/>
        </attributes>       
    </mapped-superclass>

    <embeddable class="BusinessId"
            access="FIELD">
        <attributes>
            <basic name="businessId">
                <column nullable="false" unique="true"/>
            </basic>
        </attributes>
    </embeddable>   
</entity-mappings>

Генератор создает эти два файла:

@StaticMetamodel(BusinessEntity.class)
public abstract class BusinessEntity_ {
    public static volatile SingularAttribute<BusinessEntity, Long> id;
}

@StaticMetamodel(BusinessId.class)
public abstract class BusinessId_ {
    public static volatile SingularAttribute<BusinessId, Long> businessId;
}

Как видите, встроенное поле businessId в BuinessEntity_ отсутствует!

Когда я заменяю <embedded name="businessId"/> на <basic name="businessId" />, Генератор создает этот некомпилируемый класс (универсальный T не может быть разрешен).

@StaticMetamodel(BusinessEntity.class)
public abstract class BusinessEntity_ {

    public static volatile SingularAttribute<BusinessEntity, Long> id;
    public static volatile
           SingularAttribute<BusinessEntity, BusinessId<T>> businessId;
}

Итак, мой вопрос: как правильно составить карту? - Или есть вообще лучший способ?

1 Ответ

2 голосов
/ 11 июня 2011

нельзя использовать для сложных типов.Вы должны использовать .Я также испытывал недостатки в процессоре аннотаций при применении к orm.xml.

Некоторое время назад (18 февраля) я отправил эту проблему:

http://opensource.atlassian.com/projects/hibernate/browse/METAGEN-57

К которой еще не обращались.Похоже, что этому не уделяется так много внимания, поскольку процессор работает с аннотациями.

Я предлагаю вам также сообщить о проблеме для ваших проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...