hibernate + маппинг без сущностей?

115
08 января 2022, 20:20

Я разбираю старый проект и нашел интересную вещь, которую не понимаю

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field">
    <subclass entity-name="NameClassEntity" extends="DefaultedNameClassEntity" discriminator-value="376">
        <meta attribute="main" inherit="true">dt</meta>
        <meta attribute="control" inherit="true">com.class.NameClassEntityC</meta>
        <meta attribute="control" inherit="true">com.class.QuantityNameClassEntityControl</meta>

Для этого файла в котором описываются правила для маппинга, нет класса-сущности (java класса).

Кроме того, ссылки на файлы с такими правилами (а это более 900 Xml-файлов), описаны в специальном файле hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <mapping resource="com/NameClassEntity.hbm.xml"/>
…
  </session-factory>
</hibernate-configuration>

кроме того, вот эта часть,

 discriminator-value="376"

указывает на то, что используется стратегия Hibernate:

  • a single table per class hierarchy — все enity, со всеми классами наследниками, записываются в одну и туже таблицу, а для идентификации конкретного типа entity - определяется специальная колонка discriminator column.

    Прав ли я ?

И никто из коллег не смог объяснить, как это работает ???

В один из таких xml, было добавлено поле, но оно не появилось после пересборки проекта (проект обычный, Tomcat + Java2EE, без Maven) в приложении ?...

Но ведь для того, чтобы это правило работало, оно должно иметь некоторую сущность описанную в Java-классе. И коллега утверждает, что так работает без соответствующего класса-сущности(правда среда разработки уже Eclipse, но не intellij idea)

Кстати, Hibernate-библиотека, очень старая и была модифицирована разработчиками приложения, которое теперь приходится разворачивать в среде intellij Idea.

Приложение запускается, но вот поле описанное в xml, не появилось в клиентской части, при запросе, таблицы, к которой и было описано в xml, добавляемое поле..

Обновление

Данный xml, расширяет

extends="DefaultedNameClassEntity" 

NameClassEntity - класс с таким именем отсутствует

затем

<joined-subclass entity-name="DefaultedNameClassEntity" table="DTTable" extends="Instance"
                     discriminator-value="374" defaulted="true">

DefaultedNameClassEntity - класс с таким именем не найден

extends="Instance"

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field">
    <class entity-name="Instance" table="Instance" abstract="true" discriminator-value="2">
        <id name="id" column="id" type="long" >
            <generator class="native" />
        </id>
        <discriminator column="class" type="long" insert="true" not-null="true" />
        <property name="nick" type="string" length="32" not-null="false">
            <meta attribute="description"><![CDATA[ID Пользователя]]></meta>
        </property>
    </class>
</hibernate-mapping>

Instance - найден интерфейс с таким именем в одном из проектов (все приложение состоит из 17 проектов в одном Workspace)

public interface Instance extends Configurable<Instance> {
  Long id();
  /**
   * Returns type that based on configured product information.
   */
  Type getType();
  /**
   * Saves the instance.
   */
  void store();
  /**
   * Deletes the instance.
   */
  void delete();
  /**
   * Get a value of the configurable object or returns null if there is not
   * appropriate attribute.
   */
  <V> Value<V> getValue(Attribute<V> attribute);
  Value[] getValues();
  Instance getParent();

}

У кого есть какие идеи, может мне пояснить, как вообще может hibernate работать без класса-сущности ... ?

Answer 1

Hibernate поддерживает динамические модели. То есть в данном случае ему не нужен класс. Он использует Maps of Maps во время выполнения

Фрагмент из документации hibernate 4.2 (Dynamic models):

Persistent entities do not necessarily have to be represented as POJO classes or as JavaBean objects at runtime. Hibernate also supports dynamic models (using Maps of Maps at runtime). With this approach, you do not write persistent classes, only mapping files.

<hibernate-mapping>
    <class entity-name="Customer">
        <id name="id"
            type="long"
            column="ID">
            <generator class="sequence"/>
        </id>
        <property name="name"
            column="NAME"
            type="string"/>
        <many-to-one name="organization"
            column="ORGANIZATION_ID"
            class="Organization"/>
        <bag name="orders"
            inverse="true"
            lazy="false"
            cascade="all">
            <key column="CUSTOMER_ID"/>
            <one-to-many class="Order"/>
        </bag>
    </class>
</hibernate-mapping>

Ваш случай отличается тем, что за основу берется POJO класс-родитель. Как реализовано смешивание двух подходов: через карты карт и POJO - вопрос более глубокого погружения.

READ ALSO
Как получить сообщения из чата в Slack

Как получить сообщения из чата в Slack

Необходимо получить сообщения из определенного чата Делаю запрос:

91
В чем разница между Comparable и Comparator?

В чем разница между Comparable и Comparator?

Получается, это дублирующие друг друга вещиМожет, есть какие-то реальные различия?

146
Повторить строку несколько раз

Повторить строку несколько раз

В общем есть один метод, который принимает два параметра, например метод

123