2016-12-15 3 views
0

Если у меня есть подразделы, как этотJPA - Обновление порожденных refrence родительских

public class Company implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name="COMPANY_ID", updatable = false) 
private int companyId; 

//bi-directional many-to-one association to User 
@OneToMany(mappedBy="company") 
private List<User> users; 
} 

и ребенок, как этот

public class User implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name="USER_ID", updatable=false) 
private int userId; 

private String username; 

//bi-directional many-to-one association to Company 
@ManyToOne 
@JoinColumn(name="COMPANY_ID") 
private Company company; 
} 

И тогда в моем JAX-RS REST позвонить мне получить пользователь от БД, что в компании A, и я хочу изменить, что пользователь в компании B. Вот что я имею

@POST 
@Path("updateUserCompany") 
@Produces("application/json") 
public Response updateUserCompany() { 

    //this get the company I want to set the user to 
    Company company = entityManager.createNamedQuery("Company.getCompanyByName", Company.class) 
       .setParameter("companyName", "CompanyB") 
       .getSingleResult(); 

    //this gets the user i want to change 
    User user = entityManager.createNamedQuery("User.getUserById", User.class).setParameter("userId", 1).getSingleResult(); 

    user.setCompany(company); 
    entityManager.persist(user); 
    entityManager.flush(); 

Но пользователь не обновляется в DB? Как я могу обновить его в БД?

Благодаря

+0

1) Является ли ваш JAX-RS REST класс EJB? Потому что, если этот код не выполняется внутри транзакции. Аннотируйте свой 'updateUserCompany()' метод с помощью 'javax.transaction.Transactional'. 2) Используйте метод 'entityManager.merge()' вместо 'persist' whish используется для сохранения новых сущностей (вставки строк) – Artem

ответ

0

Я считаю, что вы имеете в виду компании не обновляется от А до Б в таблице компании, когда не проходит вызывается на лице пользователя.

Вы пробовали каскадное свойство? Он предназначен для сценариев, в которых сохраненные/обновленные сопоставленные объекты (дочерние элементы) должны быть сохранены/обновлены, когда родительский объект будет сохранен/обновлен (обратное истинно, когда inverse = true).

Я также замечаю (updatable = false) для userId, но setParameter() вызывается в методе updateUserCompany. Думаю, об этом уже позаботились.

Смежные вопросы