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..n
- цель:
- 0..1
Translation
вProduct
- все еще однонаправленное отображение
- 0..1
- ограничения: дизайн базы данных не должен быть изменен
Мое решение:
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 чувствует себя плохо. Есть ли способ, которым я могу улучшить это?
Заранее спасибо!