Сохраняется с AngularJS и JPA
Я пытаюсь разработать приложение, используя Google Guice, JPA (EclipseLink) и AngularJS. В основном в этом приложении у меня есть несколько сотрудников и несколько зарплат для каждого из них.
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID_EMPLOYEE")
private long idEmployee;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "employee",targetEntity = Salary.class,fetch = FetchType.EAGER)
private List<Salary> salaries;
и объект Зарплата:
public class Salary implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID_SALARY")
private long idSalary;
@Column(name="SALARY_PA")
private String salaryPa;
@ManyToOne
@JoinColumn(name="ID_EMPLOYEE", referencedColumnName = "ID_EMPLOYEE")
private Employee employee;
Теперь я могу без проблем вставить с помощью сервисов angularJS и REST нового сотрудника. Что я не могу сделать, так это добавить новую зарплату существующему сотруднику. В основном то, что у меня есть в моем контроллере angularJS:
$scope.employee.salaries.push(this.salaryToAdd);
employeeServ.persistSalary(employee);
а потом я просто спасаю работника. Заработная плата сохраняется, но когда я пытаюсь получить сотрудника, иногда я вижу зарплату, а иногда нет. Я заметил, что зарплата не имеет никакого отношения к Сотруднику, поэтому, возможно, когда я получаю сотрудника, JPA не знает, связана ли зарплата с этим Сотрудником.
Это мой дао и часть, связанная с постоянством:
public abstract class GenericDao<E> implements AbstractDao<E> {
@Inject
private EntityManager em;
protected abstract Class<E> getGenericClass();
@Transactional
@Override
public void insert(E entity) {
em.persist(entity);
}
@Transactional
@Override
public void update(E entity) {
em.merge(entity);
}
@Transactional
@Override
public void delete(E entity) {
em.remove(entity);
}
public E findById(Long id) {
Class<E> clazz = getGenericClass();
return em.find(clazz, id);
}
public List<E> findAll() {
Class<E> clazz = getGenericClass();
CriteriaQuery<E> query = em.getCriteriaBuilder().createQuery(clazz);
Root<E> root = query.from(clazz);
query.select(root);
return em.createQuery(query).getResultList();
}
public EntityManager getEntityManager() {
return em;
}
@Path("/employee")
открытый класс EmployeeProvider {
@Inject
EmployeeDao dao;
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/get/{id}")
public String get(@PathParam("id") String id) {
final Gson gson = new GsonBuilder().setPrettyPrinting().create();
if("all".equals(id)) {
return gson.toJson(dao.findAll().toArray());
} else {
return gson.toJson(dao.findById(Long.valueOf(id)));
}
}
@POST
@Path("/post")
public void post(String employee) {
final Gson gson = new GsonBuilder().setPrettyPrinting().create();
Employee entity = gson.fromJson(employee, Employee.class);
dao.update(entity);
}