Spring Data Jpa удалить строки внешнего ключа при удалении сопоставления? - PullRequest
0 голосов
/ 10 января 2019

Вот моя первая сущность.

@Entity
@Table(name = "person")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;    

    private String firstName;
    private String lastName;

    // Removed other stuff for brevity
}

Вот моя вторая сущность

@Entity
@Table(name = "membership")
public class Membership {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String membershipType;

    // Help here, I need another column called person_id which is what will correspond 
    // to persons or person rows from person table
}

По существу, в таблице person у нас будет n человек (n строк). В то время как в таблице membership для каждого человека у нас может быть 3-4 столбца (в зависимости от их membershipType, поскольку у каждого человека может быть несколько членов, таких как первичное, групповое, индивидуальное, вторичное и т. Д., Извините за бизнес-логику). Таким образом, в действительности таблица membership может содержать более n строк.

Теперь у меня есть пара вопросов здесь

  1. Это будет OneToMany или ManyToOne из person -> membership таблицы? Я предполагаю его OneToMany от person -> membership table.

  2. Как мне добиться этого отображения в моих аннотациях jpa и классах сущностей? Мне это нужно для операции удаления, т.е. если я удаляю membership row, соответствующий person row не должен удаляться. Однако, если я удаляю person row, ALL, соответствующий membership rows должен быть удален. Как мне добиться этого отображения и функциональности?

1 Ответ

0 голосов
/ 11 января 2019

Добавить Person - не person.id - к ​​вашему Membership:

@ManyToOne
private Person person;

Это будет читаться примерно как «Многие члены могут принадлежать одному человеку» . Если вы удалите один или несколько Membership, они не будут удалены Person; просто больше не будет удалено членство.

Чтобы все Memberships из одного Person были удалены - при удалении Person - добавьте список участников в Person:

@OneToMany(cascade = CascadeType.ALL, mappedBy="person") // maybe CascadeType.REMOVE is enough for you
private List<Membership> memberships = new ArrayList<>();

На самом деле без этого вы не сможете удалить любой Person до того, как удалите все его Membership с; последний имеет ограничение внешнего ключа Person.

Это будет читаться примерно как «Один человек может иметь много членов» . Если вы удалите Person, все его Memberships также будут удалены.

Список необходим, потому что таким образом JPA может каскадно удалить на Membership для этого CascadeType.ALL (или удалить).

Атрибут mappedBy указывает JPA проверить поле person для сопоставления. Если JPA не может иначе найти поле для сопоставления, оно создаст отдельную таблицу для сопоставления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...