私は春と休止状態のアプリケーションを構築しようとしています。私はデータベースにsusesfulを追加するが、私はデータをcolectに問題がある。 この関係を持つユーザーとロールのタブがあります。 私はすべてのユーザーロールデータを取得しようとします。たとえば、ユーザーが2つのロール(Role_userおよびRole_admin)を持っている場合、私はspesificユーザーからすべてのロールをまとめます。しかし、スクリプトを置くと、私はログを休止状態にしてデータを収集することができますが、その後も休止状態もユーザーの役割のデータを削除します。それは奇妙な、私はバグを見つけることを試みる私は削除方法を入れないので。は、Spring + Hibernateと多対多の関係からすべてのデータをcolect /取得します。
ここで私のザ・スクリプト
user.java
@Entity
@Table
public class User {
@Id
@GeneratedValue
private int id;
private String userName;
private String email;
private String password;
private boolean enabled;
@ManyToMany
@JoinTable
private List<Role> roles;
/**
@OneToOne
private Employee employee;
**/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
/**
* @return the enabled
*/
public boolean isEnabled() {
return enabled;
}
/**
* @param enabled the enabled to set
*/
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
Role.java
@Entity
@Table
public class Role {
@Id
@GeneratedValue
private int id;
private String name;
@ManyToMany(mappedBy="roles")
private List<User> users;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
UserController.java
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value="user", method = RequestMethod.GET)
public String list(Model model) {
model.addAttribute("user", new User());
model.addAttribute("userlist", this.userService.findAll());
return "user";
}
//for add and edit
@RequestMapping(value= "/addAndEditUser", method = RequestMethod.POST)
public String addAndEditUser(@ModelAttribute("user") User user){
if(user.getId() == 0){
//new employee status, call save
this.userService.save(user);
}else{
this.userService.update(user);
}
return "redirect:/user";
}
//For add
@RequestMapping(value= "/addUser", method = RequestMethod.POST)
public String addUser(@ModelAttribute("user") User user){
//new employee status, call save
this.userService.save(user);
return "redirect:/user";
}
//for edit
@RequestMapping(value= "/updateUser", method = RequestMethod.POST)
public String updateUser(@ModelAttribute("user") User user){
//existing Employee status, call update function from service
userService.update(user);
return "redirect:/user";
}
@RequestMapping("/removeUser/{id}")
public String removeUser(@PathVariable("id") int id){
this.userService.delete(id);
return "redirect:/user";
}
//for call edit in list
@RequestMapping("/editUser/{id}")
public String editUser(@PathVariable("id") int id, Model model){
model.addAttribute("religionlist", this.userService.findAll());
model.addAttribute("user", this.userService.findById(id));
return "formUser";
}
@RequestMapping("https://stackoverflow.com/users/{id}")
public String detail(Model model, @PathVariable int id){
model.addAttribute("users", userService.findOneWithRole(id));
return "user-detail";
}
}
userSericeImpl.java
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Transactional
public User findById(int id) {
return userDao.findById(id);
}
@Transactional
public List<User> findAll() {
return userDao.findAll();
}
@Transactional
public void save(User user) {
user.setEnabled(true);
userDao.save(user);
}
@Transactional
public void update(User user) {
userDao.update(user);
}
@Transactional
public void delete(int id) {
userDao.delete(id);
}
@Transactional
public User findOne(int id) {
return userDao.findOne(id);
}
@Transactional
public User findOneWithRole(int id) {
return userDao.findOneWithRole(id);
}
}
UserDaoImpl.java
@Repository
public class UserDaoImpl implements UserDao{
private static final Logger logger = LoggerFactory.getLogger(UserDaoImpl.class);
@Autowired
private SessionFactory sessionFactory;
@Autowired
private RoleDao roleDao;
public User findById(int id) {
return (User)sessionFactory.getCurrentSession().get(User.class, id);
}
@SuppressWarnings("unchecked")
public List<User> findAll() {
Session session = this.sessionFactory.getCurrentSession();
List<User> userList = session.createQuery("from User").list();
return userList;
}
public void save(User user) {
Session session = this.sessionFactory.getCurrentSession();
List<Role> roles = new ArrayList<Role>();
//roles.add(roleDao.findById(2));
roles.add(roleDao.findByName("ROLE_USER"));
user.setRoles(roles);
session.persist(user);
}
public void update(User user) {
Session session = this.sessionFactory.getCurrentSession();
session.update(user);
logger.info("Employee Status updated successfully, departement Details="+user);
}
public void delete(int id) {
sessionFactory.getCurrentSession().delete(findById(id));
}
public User findOne(int id) {
return (User)sessionFactory.getCurrentSession().get(User.class, id);
}
public User findOneWithRole(int id) {
User user = findById(id);
List<Role> roles = roleDao.findByUser(id);
user.setRoles(roles);
return user;
}
}
RoleDaoImpl.java私は、ユーザーの詳細を参照
@Repository
public class RoleDaoImpl implements RoleDao{
private static final Logger logger = LoggerFactory.getLogger(RoleDaoImpl.class);
@Autowired
private SessionFactory sessionFactory;
public Role findById(int id) {
return (Role)sessionFactory.getCurrentSession().get(Role.class, id);
}
@SuppressWarnings("unchecked")
public List<Role> findAll() {
Session session = this.sessionFactory.getCurrentSession();
List<Role> roleList = session.createQuery("from Role").list();
return roleList;
}
public void save(Role role) {
Session session = this.sessionFactory.getCurrentSession();
session.persist(role);
}
public void update(Role role) {
Session session = this.sessionFactory.getCurrentSession();
session.update(role);
logger.info("Employee Status updated successfully, departement Details="+role);
}
public void delete(int id) {
sessionFactory.getCurrentSession().delete(findById(id));
}
public Role findByName(String name) {
Query query = sessionFactory.getCurrentSession().createQuery("from Role where name=:name");
query.setParameter("name", name);
Role role = (Role)query.uniqueResult();
return role;
}
@SuppressWarnings("unchecked")
public List<Role> findByUser(int id) {
Session session = this.sessionFactory.getCurrentSession();
List<Role> roles = session.createQuery("from Role where id=:id").setString("id", "%" + id + "%").list();
return roles;
}
}
ユーザーdetail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<h1>${users.userName}</h1>
<br>
User Role
<c:forEach items="${users.roles}" var="role">
<h1>${role.name}</h1>
</c:forEach>
ログアプリ:
を10:34:32,801 DEBUG AnnotationTransactionAttributeSource:108 - Adding transactional method 'UserServiceImpl.findOneWithRole' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
Hibernate:
select
user0_.id as id6_0_,
user0_.email as email6_0_,
user0_.enabled as enabled6_0_,
user0_.password as password6_0_,
user0_.userName as userName6_0_
from
User user0_
where
user0_.id=?
Hibernate:
select
role0_.id as id5_,
role0_.name as name5_
from
Role role0_
where
role0_.id=?
Hibernate:
delete
from
User_Role
where
users_id=?
どのように削除メソッドを呼び出すことができますか? どうすれば修正できますか? 私はspesific userからすべての役割をリストしたいと思います。
事前:) でのおかげであなたはどのように更新、削除を教えて気にしない場合は(多くの多くの)も... :)
はい、フェッチ= FetchType.EAGERをエンティティに追加した後でも、ユーザーはまだロールデータを取得していますか? user.setRoles(roles); <---ロールデータをユーザーに格納するのに使用しませんでしたか? – adi
2つのテーブルがマップされており、すべてのデータを熱心に取得するように求められます。 LAZYロードを使用していて、Spring mvc/webflowを使用している場合は、OpenInViewの何かのフィルタを追加して、セッションをビューに保持する必要があります。 –
私はそれを得ることができません 申し訳ありません私は初心者です.... あなたはこれ以上の詳細を説明したり、私にこれを理解するための参考電子ブックまたはリンクを教えていただけますか? 前にありがとう – adi