2016-03-02 7 views
1

У меня возникли проблемы с попыткой сохранить объекты базы данных, используя 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); 
... 
+0

Попробуйте добавить 'em.merge (person);' вместе с 'em.merge (project);' –

+0

Попытка вашего предложения @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 с ленивыми свойствами. –

ответ

0

Я думаю, что вы не используете @JoinTable в Project.class..It должны исправить ваши problem.A присоединиться к таблице необходимо облегчить отношения «многие ко многим». Я думаю, что это может быть одной проблемой.

+0

'@ JoinTable' не требуется, используется по умолчанию, если аннотация отсутствует. –

0

Я считаю, вы хотите позвонить em.persist(project), а не em.merge(project). Вам также необходимо будет позвонить em.persist(person), если вы не измените значение cascade на карте Project.person@ManyToMany.

Метод merge(...) предназначен для объединения «отстраненного» объекта обратно в контекст сохранения сущности.