Если вашему объединенному Столу нужен дополнительный столбец, отличный от его основного (основного) ключа, , вы должны реализовать дополнительный объединенный класс.
public class Foo {
Collection<FooBar> bar = new ArrayList<FooBar>();
}
public class Bar {
Collection<FooBar> foo = new ArrayList<FooBar>();
}
соединяемых класс (который необходим составной первичный ключ - реализован как статический внутренний класс) описывается следующим образом
public class FooBar {
private FooBarId fooBarId;
private String additionalProperty;
public static class FooBarId implements Serializable {
private Integer fooId;
private Integer barId;
private Foo foo;
private Bar bar;
// getter's and setter's
public FooBarId() {}
public FooBarId(Integer fooId, Integer barId) {
this.fooId = fooId;
this.barId = barId;
}
public boolean equals(Object o) {
if(!(o instanceof FooBarId))
return false;
FooBarId other = (FooBarId) o;
return new EqualsBuilder()
.append(getFooId(), other.getFooId())
.append(getBarId(), other.getBarId())
.isEquals();
}
public int hashCode() {
return new HashCodeBuilder()
.append(getFooId())
.append(getBarId())
.hashCode();
}
}
}
повторно написать отображение в
/* Foo.class */
<bag name="bar" table="table_of_foos">
<key column="BAR_ID" insert="false" update="false"/>
<one-to-many class="FooBar" table="table_of_foos"/>
</bag>
/* Bar.class */
<bag name="foo" table="table_of_foos">
<key column="FOO_ID" insert="false" update="false"/>
<one-to-many class="FooBar" table="table_of_foos"/>
</bag>
И FooBar
<class name="FooBar">
<composite-id name="fooBarId" class="FooBar$FooBarId">
<key-property name="fooId" column="FOO_ID"/>
<key-property name="barId" column="BAR_ID"/>
</composite-id>
<property name="additionalProperty" type="string"/>
<many-to-one name="foo" column="FOO_ID" class="Foo" insert="false" update="false"/>
<many-to-one name="bar" column="BAR_ID" class="Bar" insert="false" update="false"/>
</class>
Если вы хотите, вы можете также сопоставить составной элемент вместо объединенного класса (компоненту компонента не нужен (составной) первичный ключ, а имеет свой жизненный цикл, связанный с его собственным экземпляром Entity. Имейте это в виду)
Создать вас составной элемент (теперь без идентификатора)
public class FooBar {
private String additionalProperty;
private Foo foo;
private Bar bar;
}
и определить следующее отображение
/* Foo.class */
<bag name="bar" table="table_of_foos">
<key column="BAR_ID"/>
<composite-element class="FooBar">
<property name="additionalProperty" type="string"/>
<many-to-one name="foo" column="FOO_ID" class="Foo" insert="false" update="false"/>
<many-to-one name="bar" column="BAR_ID" class="Bar"/>
</composite-element>
</bag>
/* Bar.class */
<bag name="foo" table="table_of_foos">
<key column="FOO_ID"/>
<composite-element class="FooBar">
<property name="additionalProperty" type="string"/>
<many-to-one name="foo" column="FOO_ID" class="Foo" insert="false" update="false"/>
<many-to-one name="bar" column="BAR_ID" class="Bar"/>
</composite-element>
</bag>
Спасибо, это было очень полезно! – denaje
+1 для этого приятного и подробного ответа –