Я довольно новичок в Hibernate.В моей ситуации у меня есть конкретная таблица с записями, содержащими идентификаторы соединения с множеством других таблиц - все с одинаковой структурой.Чего я хотел бы добиться, так это получить что-то вроде
SELECT *
FROM main_records mr, ref1 r1, ref2 r2
WHERE r1.id = mr.id_ref1
AND r2.id = mr.id_ref2;
Основная идея заключается в повторном использовании класса для всех ссылок на соединения.
SQL
CREATE TABLE main_records
(
id integer NOT NULL,
id_ref1 integer NOT NULL,
id_ref2 integer NOT NULL
)
CREATE TABLE ref1
(
id integer NOT NULL,
value character varying
)
CREATE TABLE ref2
(
id integer NOT NULL,
value character varying
)
Я настроил базовые классы POJO
JAVA-классы
public class MainRecord {
private Integer id;
private Ref ref1;
private Ref ref2;
...
// getters and setters
}
public class Ref {
private Integer id;
private String value;
...
// getters and setters
}
Моя идея состоит в том, чтобы определить отображения Hibernate следующим образом:
Определение абстрактного суперкласса
<hibernate-mapping package="test">
<class abstract="true" name="Ref">
<id name="id" type="java.lang.Integer" column="ID">
<generator class="native" />
</id>
<property name="value" type="java.lang.String" column="VALUE" />
</class>
</hibernate-mapping>
Отображение основного объекта, расширение суперкласса, но использование отдельных таблиц
<hibernate-mapping package="test">
<union-subclass name="Ref1" table="REF1" extends="Ref" />
<union-subclass name="Ref2" table="REF2" extends="Ref" />
<class name="MainRecord" table="MAIN_RECORDS">
<id name="id" column="ID" type="java.lang.Integer" />
<many-to-one name="ref1" class="Ref1" column="ID_REF1" fetch="join" unique="true" />
<many-to-one name="ref2" class="Ref2" column="ID_REF2" fetch="join" unique="true" />
</union-subclass>
</class>
</hibernate-mapping>
Я вручную включаю файлы сопоставления в конфигурацию, загрузка кажется нормальной, но затем происходит ошибка, без каких-либо подробных объяснений:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.cxf.transport.servlet.ServletTransportFactory' defined in class path resource [META-INF/cxf/cxf-servlet.xml]: Error setting property values;
nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (2) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'bus' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring/database.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
PropertyAccessException 2: org.springframework.beans.MethodInvocationException: Property 'transportIds' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring/database.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361)
Система представляет собой смесь Spring 2.5, Hibernate 3.2, Cxf 2.3.4, Javassist 3.11,
Мои вопросы:
(a) Это правильный подход?
(b) Ошибка возникает, как только я ввожу
<union-subclass name="Ref1" table="REF1" extends="Ref" />
<union-subclass name="Ref2" table="REF2" extends="Ref" />
так что я полагаю, это не лучший способ сделать это?
(c) Можно ли это написать с аннотациями?Я не могу понять, как определить классы Ref1 и Ref2 без фактического создания для них класса POJO.(d) Могу ли я использовать более 1 уровня наследования?Я хотел бы, например, использовать абстрактный суперкласс для всех моих конкретных таблиц, которые охватывают области аудита, которые у них всех общие?Допустим, класс Ref расширяет абстрактный класс AuditTable как в Java, так и в отображениях Hibernate.