У меня возникли проблемы с попыткой сохранить объекты базы данных, используя JPA с Hibernate 5.X.JPA 2.0 @ManyToMany отношения с использованием hibernate 5.X
У меня есть два объекта, которые уже сохраняются в базе данных и метод создания отношений между ними. Связь не создается при вызове метода на сеансовом компоненте без состояния. Ниже приведен код, который поможет понять.
Алан
Entity Person.class:
/* imports needed */
@Entity
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(mappedBy = "persons")
private Set<Project> projects;
/* default contructor, getters and setters. No equals and hashcode implemented */
}
Entity Project.class
/* imports needed */
@Entity
public class Project implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
private Set<Person> persons;
/* default contructor, getters and setters. No equals and hashcode implemented */
}
сессионный фасоли Bean.class
/* imports needed */
@Stateless
public class Bean {
@Inject
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public Person findPersonById(Long id) {
return em.find(Person.class, id);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public Project findProjectById(Long id) {
return em.find(Project.class, id);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void attachProjectToPerson(Project project, Person person) {
project.getPersons().add(person);
person.getProjects().add(project);
em.merge(project);
}
}
Соответствующие свойства Hibernate на persistence.xml
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="primary">
...
<properties>
...
<property name="hibernate.ejb.use_class_enhancer" value="true" />
...
</properties>
</persistence-unit>
</persistence>
Пример кода с использованием компонент и классов
...
// User and Project with id Long(1) already exists on database
Person person = bean.findPersonById(1L); //Person retrieved right
Project project = bean.findProjectById(1L); //Project retrieved right
// When called nothing happens on table PROJECT_PERSON
bean.attachProjectToPerson(project, person);
...
Попробуйте добавить 'em.merge (person);' вместе с 'em.merge (project);' –
Попытка вашего предложения @PredragMaric не работает. Я заменил полный метод 'attachProjectToPerson' с: ' @TransactionAttribute (TransactionAttributeType.REQUIRES_NEW) \t общественной ничтожной attachProjectToPerson (Проект, лицо человека) { \t \t проект = em.merge (проект); \t \t человек = em.merge (человек); \t \t project.getPersons(). Add (person); \t \t person.getProjects(). Add (project); \t} '. Отключение hibernate.ejb.use_class_enhancer сработало. Кто-нибудь знает, если это ошибка? Мне нужно использовать его, потому что у меня есть некоторые свойства с аннотацией @Basic с ленивыми свойствами. –