Итак, у меня есть две таблицы, таблица Group и Person. У них много отношений. Группа имеет коллекцию Person and Person, получив коллекцию групп. Группа устанавливается как управляющая часть отношений. Мой вопрос: могу ли я создать нового Человека, без группы, затем создать новую группу, добавить это вновь созданное Личность, а затем сохранить эту группу, и в результате этого новое Лицо связано с новым group, если, например, вызывается «getGroups()»?ManyToMany. Весна. Возможно обновить список (B) данных в таблице A, только сохраняя таблицу B (управляющая сторона)
Мои классы: Group, Person
@Entity
@Getter
@Setter
@Table(name = Group.TABLE_NAME)
public class Group {
static final String TABLE_NAME = "GROUP";
@Id
@Column(name = "GROUP_ID", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GroupGenerator")
@SequenceGenerator(name="GroupGenerator", sequenceName = "GROUP_SEQUENCE", allocationSize = 100)
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Long id;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "GROUP_PERSON",
joinColumns = @JoinColumn(name = "GROUP_ID", referencedColumnName = "GROUP_ID"),
inverseJoinColumns = { @JoinColumn(name="PERSON_ID", referencedColumnName = "PERSON_ID")})
private Set<Person> persons= new HashSet<>();
public void addPerson(Person person){
if(!persons.contains(person)){
persons.add(person);
}
}
Person
@Entity
@Getter
@Setter
@Table(name = Person.TABLE_NAME)
public class Person {
static final String TABLE_NAME = "PERSON";
@Id
@GeneratedValue(strategy = SEQUENCE, generator = "personIdGenerator")
@SequenceGenerator(name = "personIdGenerator", sequenceName = "PERSON_SEQUENCE", allocationSize = 100)
@Column(name = "PERSON_ID", nullable = false)
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Long id;
@ManyToMany(mappedBy = "persons", fetch = FetchType.EAGER)
private Set<Group> groups = new HashSet<>();
public void addToGroup(Group group){
if(!groups.contains(group)) {
groups.add(group);
}
}
тест, который терпит неудачу, потому getGroups() пусто. Хранилище только стандартный CRUD:
@Test
public void testSaveGroupReflectedInPersonTable() throws Exception {
Group group1 = new Group;
Person person1 = new Person;
group1.addPerson(person1);
groupRepository.save(group1);
person1 = personRepository.findAll().get(0);
assertFalse(person1.getGroups().isEmpty);
}
Установить обе стороны отношений, и она должна работать: person.addToGroup (группа); –
Да, я знаю, но я хотел бы знать, возможно ли это, или даже рекомендовал/не рекомендовал просто обновлять управляющую часть отношения, обновлять обе таблицы. Если я добавлю «person.addToGroup (group)», то я работаю, но я задавался вопросом, можно ли это сделать без вызова этой функции. – Slagathor
Почему бы вам это сделать? Ваша модель в памяти нарушена независимо от того, что может или не может произойти при сохранении. group.hasPerson (person) == true: person.isInGroup (group) == false ** <<< bad ** Вы должны инкапсулировать сохранение этих двунаправленных отношений в ваших методах addXXX(). –