Ошибка отображения JPA / Hibernate, когда объекты находятся в нескольких файлах JAR - PullRequest
2 голосов
/ 25 мая 2011

У меня странное поведение с JPA / hibernate.

У меня есть 3 сущности, расположенные в 2 JAR:

  • JAR A
    • Order
    • OrderProduction
  • JAR B
    • OrderProductionImpl

Заказ (из JAR A):

@Entity
public class Order implements Serializable {
    @Id 
    private Long id;
    @OneToOne(mappedBy="parentOrder", cascade=CascadeType.ALL)
    private OrderProduction production;
}

OrderProduction (из JAR A):

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class OrderProduction implements Serializable {
    @Id
    @Column(name="order_id", insertable=false, updatable=false)
    private Long id;

    @OneToOne
    @JoinColumn(name="order_id", nullable=false)
    private Order parentOrder;
}

OrderProductionImpl (из JAR B):

@Entity
@Table(name="production_order")
public class OrderProductionImpl extends OrderProduction implements Serializable {
    @Temporal(TemporalType.TIMESTAMP)
    private Date creationDateTime;
}

Это прекрасно работает с EclipseLink (Glassfish 3.0), но с Hibernate(JBoss 6), я получаю:

javax.persistence.PersistenceException: [PersistenceUnit: testPU] Unable to configure EntityManagerFactory
Caused by: java.lang.ClassCastException: org.hibernate.mapping.UnionSubclass cannot be cast to org.hibernate.mapping.RootClass

Но если положить все объекты в один и тот же файл JAR, это нормально с Hibernate.

Я получаю тот же результат в модульном тестировании или приложенииразвертывание сервера.

Как я могу хранить свои сущности в отдельных файлах JAR, используя hibernate?

  • [Редактировать] Точность: другие сущности из JAR B успешно сопоставлены.
  • [Редактировать] Может быть проблема с загрузчиком классов в Hibernate?

Ответы [ 2 ]

0 голосов
/ 25 мая 2011

Использовали ли вы тег jar-file в файле конфигурации persistence.xml?

Согласно спецификации JPA 2.0 8.2.1.6.3

Может быть указан один или несколько файлов JAR используя вместо этого элементы jar-файла или в дополнение к отображению файлы, указанные в mapping-файле элементы. Если указано, эти JAR файлы будут искать управляемые классы постоянства и любое отображение найденные на них аннотации метаданных будут обработаны, или они будут сопоставлены с использованием аннотации сопоставления значения по умолчанию, определенные этим Спецификация. Такие файлы JAR указывается относительно каталога или JAR-файл, который содержит [82] корень единица постоянства. [83]

Следующие примеры иллюстрируют использование элемента jar-file для ссылка дополнительная настойчивость классы. Эти примеры используют соглашение, что файл JAR с именем заканчивается в «PUnit» содержит файл persistence.xml и банку файл с именем, оканчивающимся на «Сущности» содержит дополнительные уроки персистенции.

app.ear
lib/earEntities.jar
earRootPUnit.jar (with META-INF/persistence.xml )

persistence.xml contains:
<jar-file>lib/earEntities.jar</jar-file>

Другие примеры вы можете увидеть в спецификации.

Надеюсь, это поможет.

0 голосов
/ 25 мая 2011

Конфигурационный файл Hibernate требует ссылки на все сущности относительно его пути, поэтому, на мой взгляд, нельзя разделять сущности в разных банках.

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