Однонаправленный спящий режим один к одному

У меня два класса

class Point {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "point_id")
    private Long id;

    @Column(name = "name")
    private String name;
}
class Link {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "link_id")
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToOne
    @JoinColumn(name = "fp_id")
    private Point firstPoint;

    @OneToOne
    @JoinColumn(name = "sp_id")
    private Point secondPoint;
}

Если я удалю ссылку, я получаю ошибку ограничения. Я хочу получить следующий функционал:

  1. удалить точку -> ссылка удаляется автоматически
  2. удалить ссылку -> Точка не удалялась автоматически

Как настроить это отношение?

ОБНОВЛЕНИЕ Схема БД

Схема БД


person avfrolov    schedule 05.08.2014    source источник
comment
Как бы выглядела ваша схема базы данных?   -  person Maarten Winkels    schedule 06.08.2014
comment
@MaartenWinkels см. Обновление, пожалуйста   -  person avfrolov    schedule 06.08.2014


Ответы (2)


Для меня это не похоже на однозначную ассоциацию, поскольку точка может иметь несколько входящих ссылок. Это скорее похоже на ВИРТУАЛЬНУЮ связь «один ко многим» на стороне точки и две ассоциации «многие к одному» на стороне ссылки.

На самом деле сопоставление «один-ко-многим» очень сложно, так как его нужно будет сопоставить с ДВУМЯ столбцами на дочерней стороне. Вы можете исправить это, установив две коллекции в точке, по одной для каждого столбца в ссылке, например входящие и исходящие ссылки, эффективно превратив неориентированный граф в ориентированный, но это изменит логику.

Проще всего было бы реализовать простое сопоставление с двумя свойствами «многие к одному». После этого удаление ссылок должно выполняться приложением непосредственно перед удалением точки с помощью операции пакетного удаления hql: удалить из ссылки, где firstPoint =: point или secondPoint =: point.

Если вам действительно требуется спящий режим для удаления за вас, я бы предложил создать две коллекции с помощью cascade = delete.

person Maarten Winkels    schedule 05.08.2014
comment
Спасибо за ваш ответ! Вы правы, это не выглядит как однозначное объединение, но я не знаю, как назвать это объединение. К сожалению, мне не нужны ссылки на Link в entity Point. Я могу отображать точки как идентификаторы в Link и вручную управлять операциями CRUD ... Но я хочу использовать возможности Hibernate - person avfrolov; 06.08.2014
comment
См. Этот вопрос: stackoverflow.com/questions/1715146/. То, что вы хотите, невозможно. Вы могли бы сделать это с помощью специфичных для БД вещей, таких как она: stackoverflow.com/questions/1137320/. - person Maarten Winkels; 06.08.2014

Попробуй это

@OneToOne(cascade = CascadeType.REMOVE)
person sanj    schedule 05.08.2014
comment
Спасибо за ваш ответ! Но этот каскадный тип удаляет ссылки и связанные с ними точки. Но я хочу удалить только ссылку. - person avfrolov; 06.08.2014
comment
Вам лучше попробовать индивидуальные предложения, сделанные @MaartenWinkels. - person sanj; 06.08.2014