Расширение классов сущностей с помощью составных ключей в спящем режиме - PullRequest
1 голос
/ 13 августа 2011

В нашей компании есть странная модель базы данных, которую нельзя изменить, поскольку многие системы работают с ними. Вплоть до того, что у нас есть прямое Java-приложение, которое подключается к базе данных в спящем режиме и загружает данные. У нас есть для каждой таблицы один файл сопоставления xml.

Странная вещь в базе данных в том, что у нас нет первичных ключей. Большинство таблиц имеют уникальный индекс, содержащий несколько столбцов.

Теперь мы хотим использовать сервер приложений (jboss) и модель ejb. Итак, я создал такой класс:

   @Entity
   @Table (name = "eakopf_t")
   public class Eakopf implements Serializable {

       @Embeddable
       public static class EakopfId implements Serializable { 

            private String mandant;

            private String fk_eakopf_posnr;

            // I removed here the getters and setters to shorten it up

       }

       @Id
       private EakopfId id;

       private String login;

       // I removed the getters and setters here as well    
   }

Это прекрасно работает.

Поскольку у наших клиентов разные версии схемы базы данных, я думал о расширении этого класса при каждом изменении выпуска базы данных. Таким образом, каждый интерфейс, который мы создаем с помощью Java, может решить, какая версия таблицы будет использоваться.

Вот расширенный класс таблицы

   @Entity
   @Table (name = "eakopf_t")
   public class Eakopf6001 extends Eakopf implements Serializable {

        private String newField;

        // getters and setters
   }

Если я использую Eakopf (базовая версия), он работает, если я делаю что-то подобное:

EakopfId id = new EakopfId();
id.setMandant("001");
id.setFk_eakopf_posnr("ABC");
Eakopf kopf = (Eakopf) em.find(Eakopf.class, id);

Но если я сделаю это:

EakopfId id = new EakopfId();
id.setMandant("001");
id.setFk_eakopf_posnr("ABC");
Eakopf6001 kopf = (Eakopf6001) em.find(Eakopf6001.class, id);

происходит это исключение

javax.ejb.EJBException: javax.persistence.PersistenceException: 
org.hibernate.WrongClassException: Object with id: 
de.entity.Eakopf$EakopfId@291bfe83 was not of the specified subclass:  
de.entity.Eakopf (Discriminator: null)

У кого-нибудь есть идея?

много приветствий, Hauke ​​

1 Ответ

2 голосов
/ 13 августа 2011

То, что вы сделали, означает для Hibernate, что вы храните два разных типа сущностей в одной таблице.Это возможно, если вы используете столбец дискриминатора.Но если я правильно понимаю, вы просто хотите один вид сущности в таблице: Eakopf6001.В этом случае его базовый класс должен быть помечен @MappedSuperClass, а не @Entity.

Я бы предложил создать класс, помеченный @MappedEntity (назовем его BaseEakopf), и две сущности: EaKopf и EaKopf6001, каждая со своим набором дополнительных полей.Включите одну из других сущностей в список сопоставленных классов, в зависимости от того, какой из них вы хотите использовать.

Мое личное мнение таково, что если у вас несколько версий вашего приложения, они должны использовать одни и те же сущности., но с разными полями.Ваша система контроля версий будет заботиться об этих нескольких версиях, а не об исходном коде (т. Е. Иметь один набор исходных файлов на версию приложения, а не один набор исходных файлов для всех возможных версий).

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