Обратная разработка HIbernate tools создает коллекцию в уникальном столбце

#java #hibernate #reverse-engineering #hibernate-tools

#java #гибернация #обратный инжиниринг #hibernate-tools

Вопрос:

Имея таблицу A и таблицу B, A имеет значение fk для B. В A столбец этого FK уникален и может обнуляться. Это означает, что на B ссылаются как максимум на один A.

Но обратная разработка hibernate tools генерирует pojos как:

Замените A полем B. Хорошо, это правильно. Pobo B с набором A. Нет, это не так, должно быть единственное поле A.

Что не так? Я что-то упускаю?

это мой reveng.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering SYSTEM "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >

<hibernate-reverse-engineering>

<type-mapping>
    <sql-type jdbc-type="BIGINT" hibernate-type="java.math.BigInteger" />
    <sql-type jdbc-type="NUMERIC" precision="19" hibernate-type="java.math.BigInteger"/>
    <sql-type jdbc-type="NUMERIC" precision="10" not-null="true" hibernate-type="int"/>
    <sql-type jdbc-type="NUMERIC" precision="10" not-null="false" hibernate-type="java.lang.Integer"/>
    <sql-type jdbc-type="NUMERIC" precision="4" not-null="true" hibernate-type="byte"/>
    <sql-type jdbc-type="NUMERIC" precision="4" not-null="false" hibernate-type="java.lang.Byte"/>
    <sql-type jdbc-type="OTHER" hibernate-type="timestamp"/>
</type-mapping>

<table-filter match-name="MLOG.*"  exclude="true" /> 
<table-filter match-name="RUPD.*"  exclude="true" />  

<!-- Forzamos a que el id sea Integer. Al eliminar el autoincremental hibernate pasa este campo a int.-->
<!-- Se cambia el codigo para que no afecte el tipo-->
<!--
<table name="cpanel_bloque_canal" catalog="ob_cpanel"> 
    <primary-key>                       
        <key-column name="idBloque" type="java.lang.Integer"/>
    </primary-key>
</table>
-->
  

Комментарии:

1. Не могли бы вы опубликовать соответствующий hibernate.reveng.xml файл?

2. Обратная разработка Hibernate не идеальна и не делает все так логично, как это может показаться нам, людям. Существует множество проблем и крайних случаев, которые не работают. Я постоянно сталкиваюсь с подобными вещами. Вы нашли решение этой проблемы? Я подозреваю, что обратная разработка Hibernate просто не может справиться с этим.

Ответ №1:

Сопоставление правильное, потому что в этом случае на одну запись из таблицы B ссылаются несколько записей из таблицы A.

Пример

  • Таблица с данными:
  • ИДЕНТИФИКАТОР ID_FROM_B
  • 1 1
  • 2 1
  • 3 2

  • Данные таблицы B:

  • ID
  • 1
  • 2

Если бы вы получали записи из таблицы B и объединяли записи A в ней, вы бы получили результаты:

Для B ID 1: ID (TableA) 1; ID (TableA) 2 — Это должно быть помещено в коллекцию, вот почему вы получаете подобную структуру pojo.

Комментарии:

1. Но если FK из A УНИКАЛЕН, как на запись из таблицы B могут ссылаться несколько записей из таблицы A?

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

3. Взгляните на это для создания один к одному в mysql: mkyong.com/mysql/how-to-define-one-to-one-relationship-in-mysql

4. Это не решает мою проблему, потому что отношение should может быть нулевым. Я имею в виду, что отношение равно 0: 1 — 1