Hiberante: (XML): частично совместно используемый составной первичный ключ (пакет) один-к-одному

Мы долго искали, но не нашли действительно хорошего решения для следующей задачи (упрощение реальных классов).

  • Таблица product:
    • родительский стол
    • составной ПК: manuf, sku, catalog
  • Таблица translation:
    • составной ПК: manuf, sku, catalog, index_
    • дочерний стол для product:
      → композит FK: manuf, sku, catalog
  • оригинальный дизайн:
    • 0..n Translationс за Product (→ ошибка, всегда было только 0 или 1)
    • Translation как bag в Product.hbm.xml а также Set<Translation> в Product.java
    • однонаправленное отображение
  • цель:
    • 0..1 Translation в Product
    • все еще однонаправленное отображение
  • ограничения: дизайн базы данных не должен быть изменен

Мое решение:

Translation.hbm.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="Translation" table="Translations_complex">
        <composite-id class="ProductId" name="id">
            <key-property column="sku" name="sku" type="string" />
            <key-property column="manuf" type="int" name="manuf" />
            <key-property column="catalog" length="128" name="catalog" />
        </composite-id>
        <!-- part of the table's PK but now obsolete -->
        <property column="INDEX_" name="index" access="field"/>
        <property name="description" column="description"/>
    </class>
</hibernate-mapping>

Product.hbm.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="Product" table="Products">
        <composite-id class="ProductId" name="id">
            <key-property name="sku" type="string">
                <column length="128" name="sku" />
            </key-property>
            <key-property name="manuf" type="int">
                <column name="manuf" />
            </key-property>
            <key-property name="catalog" type="string">
                <column length="128" name="catalog" />
            </key-property>
        </composite-id>
        <one-to-one name="translation" class="Translation"
            cascade="save-update" />
    </class>
</hibernate-mapping>

Translation.java

public class Translation implements Serializable {
    private static final long serialVersionUID = 1L;
    private ProductId id;
    private String description;
    private final int index=0;
    // constructor, setter/getter for all attributes EXCLUDING index
}

Product.java

public class Product implements Serializable{
    private static final long serialVersionUID = 1L;
    private ProductId id;
    private Translation translation;
    // constructor, setter/getter for all attributes
}

ProductId.java

public class ProductId implements Serializable {
    private static final long serialVersionUID = 1L;
    private String sku;
    private int manuf;
    private String catalog;
    // constructor, setter/getter for all attributes
}

index как часть Translation и не отдельный класс ID чувствует себя плохо. Есть ли способ, которым я могу улучшить это?

Заранее спасибо!

0 ответов

Другие вопросы по тегам