2017-02-21 18 views
0

Итак, у меня есть две таблицы, таблица 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); 
} 
+0

Установить обе стороны отношений, и она должна работать: person.addToGroup (группа); –

+0

Да, я знаю, но я хотел бы знать, возможно ли это, или даже рекомендовал/не рекомендовал просто обновлять управляющую часть отношения, обновлять обе таблицы. Если я добавлю «person.addToGroup (group)», то я работаю, но я задавался вопросом, можно ли это сделать без вызова этой функции. – Slagathor

+0

Почему бы вам это сделать? Ваша модель в памяти нарушена независимо от того, что может или не может произойти при сохранении. group.hasPerson (person) == true: person.isInGroup (group) == false ** <<< bad ** Вы должны инкапсулировать сохранение этих двунаправленных отношений в ваших методах addXXX(). –

ответ

0

Я думаю, вы должны использовать org.hibernate.annotations.CascadeType

Эта статья может помочь вам: http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/

+0

Я уже использую «javax.persistence.CascadeType» для установки в «Класс CascadeType.ALL» в классе Group, поскольку я хотел, чтобы save() отображался в таблице Person. – Slagathor

+0

Прочтите статью, пожалуйста. Это объясняет, почему «javax.persistence.CascadeType» не сохраняет объекты в Hibernate. –

+0

Хммм, это не решило его для меня. Такая же проблема сохраняется – Slagathor