// Path: people/src/main/java/com/example/people/entities/Person.java
// @Entity
// @Table(name = "PEOPLE_PERSON")
// @NamedQueries({
//     @NamedQuery(name = "selectAllPersons", query = "select o from Person o order by o.id"),
//     @NamedQuery(name = "selectAllPersonsForRole", query = "select o from Person o left join o.roles r where r.id=:roleId"),
//     @NamedQuery(name = "countPersonsForRole", query = "select count(o.id) from Person o left join o.roles r where r.id=:roleId")
// })
// public class Person implements Serializable {
// 
//     private static final long serialVersionUID = -2346897234623746L;
//     
//     @Id
//     @GeneratedValue(strategy = GenerationType.AUTO)
//     private int id;
// 
//     @Column(nullable = false)
//     private String firstName;
// 
//     @Column(nullable = false)
//     private String lastName;
// 
//     @ManyToMany
//     @JoinTable(name = "PEOPLE_PERSON_ROLE",
//             joinColumns = @JoinColumn(name = "PERSON_ID", referencedColumnName = "ID"),
//             inverseJoinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID"))
//     private Set<Role> roles;
// 
//     protected Person() {
//     }
// 
//     public Person(String firstName, String lastName) {
//         id = 0;
//         this.firstName = firstName;
//         this.lastName = lastName;
//         this.roles = new HashSet<>();
//     }
//     
//     public int getId() {
//         return id;
//     }
// 
//     public String getFirstName() {
//         return firstName;
//     }
// 
//     public void setFirstName(String firstName) {
//         this.firstName = firstName;
//     }
// 
//     public String getLastName() {
//         return lastName;
//     }
// 
//     public void setLastName(String lastName) {
//         this.lastName = lastName;
//     }
// 
//     public Set<Role> getRoles() {
//         return Collections.unmodifiableSet(roles);
//     }
// 
//     public void addRole(Role role) {
//         this.roles.add(role);
//     }
// 
//     public void clearRoles() {
//         roles.clear();
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hashCode(firstName)
//                 ^ Objects.hashCode(lastName)
//                 ^ Objects.hashCode(roles);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == null || getClass() != obj.getClass())
//             return false;
// 
//         final Person other = (Person) obj;
//         return Objects.equals(firstName, other.firstName)
//                 && Objects.equals(lastName, other.lastName)
//                 && Objects.equals(roles, other.roles);
//     }
// 
//     public int[] getRoleIds() {
//         int[] result = new int[roles.size()];
//         int i = 0;
//         for (Role role : roles) {
//             result[i] = role.getId();
//             i++;
//         }
//         return result;
//     }
// 
// }
// 
// Path: people/src/main/java/com/example/people/entities/Role.java
// @Entity
// @Table(name = "PEOPLE_ROLE")
// @NamedQuery(name = "selectAllRoles", query = "select o from Role o order by o.id")
// public class Role implements Serializable {
// 
//     private static final long serialVersionUID = 238947623894234L;
//     
//     @Id
//     @GeneratedValue(strategy = GenerationType.AUTO)
//     private int id;
// 
//     @Column(nullable = false)
//     private String name;
//     
//     @Column(nullable = false)
//     private String description;
// 
//     protected Role() {
//     }
// 
//     public Role(String name, String description) {
//         id = 0;
//         this.name = name;
//         this.description = description;
//     }
//     
//     public int getId() {
//         return id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public void setDescription(String description) {
//         this.description = description;
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hashCode(name) ^ Objects.hashCode(description);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == null || getClass() != obj.getClass())
//             return false;
// 
//         final Role other = (Role) obj;
//         return Objects.equals(this.name, other.name)
//                 && Objects.equals(this.description, other.description);
//     }
//     
// }


import com.example.people.entities.Person;
import com.example.people.entities.Role;
import java.util.List;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
package com.example.people.ejb;


@Stateful
public class PersonRoleManagerBean implements PersonRoleManager {
    
    private static final long serialVersionUID = 234732489234234L;
    
    @PersistenceContext
    private EntityManager em;
    
    @Override
    public Person getPerson(int id) {
        return em.find(Person.class, id);
    }

    @Override
    public void createPersonWithRoles(String firstName, String lastName, int[] roleIds) {
        Person person = new Person(firstName, lastName);
        setPersonRoles(person, roleIds);
        em.persist(person);
    }
    
    private void setPersonRoles(Person person, int[] roleIds) {
        person.clearRoles();
        for (int roleId : roleIds) {
// Path: people/src/main/java/com/example/people/entities/Person.java
// @Entity
// @Table(name = "PEOPLE_PERSON")
// @NamedQueries({
//     @NamedQuery(name = "selectAllPersons", query = "select o from Person o order by o.id"),
//     @NamedQuery(name = "selectAllPersonsForRole", query = "select o from Person o left join o.roles r where r.id=:roleId"),
//     @NamedQuery(name = "countPersonsForRole", query = "select count(o.id) from Person o left join o.roles r where r.id=:roleId")
// })
// public class Person implements Serializable {
// 
//     private static final long serialVersionUID = -2346897234623746L;
//     
//     @Id
//     @GeneratedValue(strategy = GenerationType.AUTO)
//     private int id;
// 
//     @Column(nullable = false)
//     private String firstName;
// 
//     @Column(nullable = false)
//     private String lastName;
// 
//     @ManyToMany
//     @JoinTable(name = "PEOPLE_PERSON_ROLE",
//             joinColumns = @JoinColumn(name = "PERSON_ID", referencedColumnName = "ID"),
//             inverseJoinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID"))
//     private Set<Role> roles;
// 
//     protected Person() {
//     }
// 
//     public Person(String firstName, String lastName) {
//         id = 0;
//         this.firstName = firstName;
//         this.lastName = lastName;
//         this.roles = new HashSet<>();
//     }
//     
//     public int getId() {
//         return id;
//     }
// 
//     public String getFirstName() {
//         return firstName;
//     }
// 
//     public void setFirstName(String firstName) {
//         this.firstName = firstName;
//     }
// 
//     public String getLastName() {
//         return lastName;
//     }
// 
//     public void setLastName(String lastName) {
//         this.lastName = lastName;
//     }
// 
//     public Set<Role> getRoles() {
//         return Collections.unmodifiableSet(roles);
//     }
// 
//     public void addRole(Role role) {
//         this.roles.add(role);
//     }
// 
//     public void clearRoles() {
//         roles.clear();
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hashCode(firstName)
//                 ^ Objects.hashCode(lastName)
//                 ^ Objects.hashCode(roles);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == null || getClass() != obj.getClass())
//             return false;
// 
//         final Person other = (Person) obj;
//         return Objects.equals(firstName, other.firstName)
//                 && Objects.equals(lastName, other.lastName)
//                 && Objects.equals(roles, other.roles);
//     }
// 
//     public int[] getRoleIds() {
//         int[] result = new int[roles.size()];
//         int i = 0;
//         for (Role role : roles) {
//             result[i] = role.getId();
//             i++;
//         }
//         return result;
//     }
// 
// }
// 
// Path: people/src/main/java/com/example/people/entities/Role.java
// @Entity
// @Table(name = "PEOPLE_ROLE")
// @NamedQuery(name = "selectAllRoles", query = "select o from Role o order by o.id")
// public class Role implements Serializable {
// 
//     private static final long serialVersionUID = 238947623894234L;
//     
//     @Id
//     @GeneratedValue(strategy = GenerationType.AUTO)
//     private int id;
// 
//     @Column(nullable = false)
//     private String name;
//     
//     @Column(nullable = false)
//     private String description;
// 
//     protected Role() {
//     }
// 
//     public Role(String name, String description) {
//         id = 0;
//         this.name = name;
//         this.description = description;
//     }
//     
//     public int getId() {
//         return id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public void setDescription(String description) {
//         this.description = description;
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hashCode(name) ^ Objects.hashCode(description);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == null || getClass() != obj.getClass())
//             return false;
// 
//         final Role other = (Role) obj;
//         return Objects.equals(this.name, other.name)
//                 && Objects.equals(this.description, other.description);
//     }
//     
// }


// Path: people/src/main/java/com/example/people/ejb/PersonRoleManagerBean.java
import com.example.people.entities.Person;
import com.example.people.entities.Role;
import java.util.List;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

package com.example.people.ejb;


@Stateful
public class PersonRoleManagerBean implements PersonRoleManager {
    
    private static final long serialVersionUID = 234732489234234L;
    
    @PersistenceContext
    private EntityManager em;
    
    @Override
    public Person getPerson(int id) {
        return em.find(Person.class, id);
    }

    @Override
    public void createPersonWithRoles(String firstName, String lastName, int[] roleIds) {
        Person person = new Person(firstName, lastName);
        setPersonRoles(person, roleIds);
        em.persist(person);
    }
    
    private void setPersonRoles(Person person, int[] roleIds) {
        person.clearRoles();
        for (int roleId : roleIds) {
            Role role = getRole(roleId);