Hibernate: могу ли я переопределить генератор идентификаторов, используя XML, с собственным генератором? - PullRequest
2 голосов
/ 23 марта 2010

Я хочу использовать генератор пользовательских последовательностей в своем приложении, но объект находится в jar модели домена, который используется совместно с другими приложениями. Очевидно, аннотации сущностей могут быть переопределены в orm.xml, но я не могу понять, какое правильное заклинание XML заставит это работать.

Я могу изменить аннотацию в сущности следующим образом:

@GenericGenerator(name = "MYGEN", strategy = "MyCustomGenerator")
@GeneratedValue(generator = "MYGEN")

Но мне нужно как-то сопоставить это с orm.xml, чтобы переопределить исходную аннотацию. Глядя на orm.xml схему здесь , выясняется, что я даже не могу указать тип генерации, кроме "sequence" и "table".

Я должен упомянуть, что я использую JPA с Hibernate, если это имеет значение.

1 Ответ

4 голосов
/ 27 мая 2010

Вы смотрели документацию по спящим аннотациям? http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.3/doc/hibernate/Annotations_Reference_Guide/Overriding_metadata_through_XML.html

Это довольно хорошо объясняет, как переопределить конфигурации аннотаций в orm xmls,

Например, рассмотрим эту сущность:

@Entity
@Table(name = "API_USERS")
public class ApiUser {

    @Id
    @Column(name = "ID", unique = true, nullable = false, precision = 6, scale = 0)
    private Long id;
    ...
}

Чтобы переопределить поле идентификатора генератором последовательности, который я использовал:

<?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 orm_1_0.xsd"
  version="1.0">
    <entity class="com.muzicall.apiusers.entity.ApiUser" access="FIELD">
        <attributes>
            <id name="id">
                <column name="id"/>
                <generated-value generator="apiUserIdGen" strategy="SEQUENCE"/>
                <sequence-generator name="apiUserIdGen" sequence-name="api_users_seq" allocation-size="1"/>
            </id>
        </attributes>
    </entity>
</entity-mappings>
...