Как делают меня объединяющие таблицы на столбцах непервичного ключа во вторичных таблицах?

Вот то, что я придумал. Не знайте, будет ли это окончательная версия все же.

Воображают шестиугольную сетку, и в каждой вершине, солнечной системе. С тех пор мы находимся на шестиугольной сетке, существует только три строки, идущие от любой вершины. Каждый всегда горизонтален, и другие два являются диагоналями. Если мы даем стартовому семени значение n, мы можем дать солнечную систему, которая горизонтально подключена к начальной точке значение n+1, другие получают значения n+2 и n-2.

, О, дерьмо. Мы привычка обязательно получаем сетку. Damnit. Позволяет попробовали еще раз.

12
задан Jherico 29 September 2009 в 19:17
поделиться

3 ответа

Я смог найти решение этой проблемы. Если вы сопоставите класс Bar следующим образом

@Entity
@DiscriminatorValue("1")
@SecondaryTable(name = "BAR", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "FOO_ID", referencedColumnName = "FOO_ID") })
public class Bar extends Foo {
    @OneToOne
    @JoinColumn(table = "BAR", name = "BAR_ID")
    MiniBar miniBar;
}

и добавите следующий класс

@Entity
@SqlResultSetMapping(name = "compositekey", entities = @EntityResult(entityClass = MiniBar.class, fields = { @FieldResult(name = "miniBar", column = "BAR_ID"), }))
@NamedNativeQuery(name = "compositekey", query = "select BAR_ID from BAR", resultSetMapping = "compositekey")
@Table(name = "BAR")
public class MiniBar {
    @Id
    @Column(name = "BAR_ID")
    Long barId;
} 

, вы можете добавить любое сопоставление, которое хотите, в класс MiniBar , как если бы barId был первичным ключом, а затем сделать его доступным во внешнем классе Bar .

7
ответ дан 2 December 2019 в 22:05
поделиться

Вы не сможете делать то, что хотите. @CollectionOfElements (и @OneToMany, если на то пошло) всегда сопоставляются через первичный ключ объекта владельца.

Способ сопоставления наследования Foo / Bar также довольно странный - они явно не совпадают Таблица; похоже, что использование JoinedSubclass было бы лучшим подходом. Имейте в виду, что это все равно не поможет вам сопоставить bar_names с bar_id , потому что значение первичного ключа совместно используется в иерархии (даже если имя столбца может отличаться для подкласса).

Возможная альтернатива - использовать сопоставление @OneToOne между Foo и Bar вместо наследования. Который'

2
ответ дан 2 December 2019 в 22:05
поделиться

Не знаю, как это сделать с JPA / аннотациями, но с файлами сопоставления XML Hibernate это будет примерно так:

<class name="Bar" table="BAR">
    <id name="id" type="int">
        <column name="BAR_ID"/>
        <generator class="native"/>
    </id>
    <set name="barNames" table="BAR_NAMES">
        <!-- Key in BAR_NAMES table to map to this class's key -->
        <key column="BAR_ID"/> 
        <!-- The value in the BAR_NAMES table we want to populate this set with -->
        <element type="string" column="BAR_NAME"/>
    </set>
</class>
2
ответ дан 2 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: