2016-08-31 2 views
0

У меня есть два лица:Hibernate Вставка внешнего ключа из форм

1)

@Entity 
@Table(name = "users") 
public class User { 

    private String username; 
    private String password; 
    private String name; 
    private String surname; 
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumn(name = "depId") 
    private Department department; 
    private boolean enabled; 
    private Set<UserRole> userRole = new HashSet<UserRole>(0); 
    private Set<Equipment> equipment = new HashSet<Equipment>(); 

2)

@Entity 
@Table(name = "department") 
public class Department { 

    private int depId; 
    private String name; 
    private String adress; 
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "department") 
    private Set<User> user = new HashSet<User>(); 

Как я могу написать HQL запрос, чтобы вставить значения для пользователя. Не из другого стола. У меня есть JSP-форма, где вставляются формы. Я хочу добавить значения из этих форм. И у меня проблема с методом «delete».

UserDAOImpl:

@Override 
    public User findByUserName(String username) { 
     return (User) getSession().get(User.class, username); 
    } 

@Override 
    public void delete(String username) { 
     getSession().delete(findByUserName(username)); 
    } 

Когда я использую этот метод, удаление 'отдел' в Департаменте и 'USER_ROLE' в UserRole таблице. Но я хочу удалить только пользователя.

UPDATE

Эта проблема исправлена. Но у меня вторая проблема. У меня есть вторая Entity, вроде Depatment с именем UserRole. И есть те же методы. Мне нужен метод:

UserRoleDAOImpl:

@Override 
public Set<UserRole> findByRole (Set<UserRole> userRole){ 

} 

DepartmentDAOImpl:

@Override 
public Department findByDepartmentName(String departmentName) { 
    List<Department> departments = getSession() 
      .createQuery("select d from Department d where d.name =:departmentName") 
      .setParameter("departmentName", departmentName).list(); 
    return departments.size() == 0 ? null : departments.get(0); 
} 

Контроллер:

@RequestMapping(value = "/updateUser", method = RequestMethod.POST) 
private ModelAndView updateUser(@ModelAttribute("users") User user, BindingResult result) { 
    ModelAndView model = new ModelAndView(); 
    department = departmentService.findByDepartmentName(user.getDepartment().getName()); 
    user.setDepartment(department); 
    userRole = userRoleService.findByRole(user.getUserRole()); 
    user.setUserRole(userRole); 
    userService.update(user); 
    model.addObject("allUsers", userService.getAllUsers()); 
    model.setViewName("superAdmin"); 
    return model; 
} 

Я не знаю, как писать userRoleService.findByRole(user.getUserRole()). Он не работает должным образом.

+0

You не нужно писать какой-либо запрос для сохранения объекта. используйте метод entityManager.persists() – Jens

+0

Но как я могу добавить «отдел» внешнего ключа? – Farik013

+0

Это будет сделано в спящем режиме, если вы установите отдел для пользователя и пользователя в отдел – Jens

ответ

0

Поскольку вы используете аннотации, вам нужно прочитать о транзакциях спящего режима для вставок в db.Hoping, вы уже создали таблицу в db.

Вы можете создать объект SessionFactory для своего приложения и использовать Criti api для сохранения значений формы в db. Вы можете найти образец ссылки

http://www.dineshonjava.com/2013/08/spring-crud-example-using-many-to-one.html#.V8aQp_l97IU 

Если вы все еще хотите писать запросы только тогда вы можете использовать критерии с HQL

https://www.mkyong.com/hibernate/hibernate-criteria-examples/ 

Благодарности Прадипом

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