LINUX.ORG.RU

Hibernate mapping с альтернативными полями

 , , ,


0

1

Есть 2 модели: Кабель и Порт. Кабель о двух концах, каждый из которых можно воткнуть в порт. Таким образом:

@Table(name="cables")
class Cable {
    @Id
    private Long id;
    @Column(name="dstport_id")
    @OneToOne
    private Port dstPort;
    @Column(name="srcport_id")
    @OneToOne
    private Port srcPort;
}
@Table(name="ports")
class Port {
    @Id
    private Long id;
    private Cable cable; // Тут должен быть аннотированный маппинг в Cable по полям cables.dstport_id ИЛИ cables.srcport_id, если такое соответствие найдется.
}

Собственно, отношение тут один-к-одному в обоих случаях. Вот только со стороны Порт отношение использует любое из двух полей Кабель, которое ссылается на этот Порт. При этом, это не отношение по составному внешнему ключу, это отношение по единичному внешнему полю (либо srcport_id, либо dstport_id). В сиквеле делается за 5 секунд. Есть решение для маппера Hibernate (желательно в терминах аннотаций)?

UPD: поправил для большей ясности.

★★

Последнее исправление: GateKeeper (всего исправлений: 1)

@Entity
@Table
class Cable {
    @Id
    private int id;

    @OneToOne
    private Port srcPort;

    @OneToOne
    private Port destPort;
}

@Entity
@Table
class Port {
    @Id
    private int id;

    @OneToOne
    private Cable cable;
}
anonymous
()
Ответ на: комментарий от anonymous

@OneToOne private Cable cable;

И он сам разрулит, что ссылка на Port может быть либо в srcPort, либо в dstPort ? Или таки надо ему носом тыкать, что join ... on id = srcport_id OR id = dstport_id ?

GateKeeper ★★
() автор топика
Ответ на: комментарий от JFreeM

опять повторю вопрос:

у меня 2 поля, поиск ссылки на Port в Cable идет по принципу XOR (т.е. либо там, либо тут, либо нигде). В документации по mappedBy пишут «column» (единственное число). Позволит этот mappedBy ткнуть в такую ситуацию?

GateKeeper ★★
() автор топика
Ответ на: комментарий от GateKeeper

хз, я бы вообще так не делал. Сделайте два поля sourceFor и destinationFor.
Вообще «входящий кабель» и «исходящий кабель» - две разные бизнес-сущности и я бы не стал пытаться впихнуть их в одно поле.

JFreeM ★★★☆
()
Ответ на: комментарий от JFreeM

Это не «входящий кабель» и «исходящий кабель». Это два порта, к которым кабель (патч-корд, например) подключен. Я даже не могу никак представить себе подобный маппинг с внешней таблицей. Просто назвал srcport и dstport, чтобы избежать херни с port1 и port2 (мне в моем случае так тупо понятней, а впоследствии даже, возможно на этом часть логики будет построена, например, при отрисовке схемы прохождения пакета по всей топологии сети).

GateKeeper ★★
() автор топика
Ответ на: комментарий от JFreeM

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

GateKeeper ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.