将ManyToMany相关对象列出到当前用户会话

时间:2014-03-06 03:01:08

标签: java spring hibernate spring-security many-to-many

我有一个现有的数据库建模方式如下:

用户 - Id(PK),登录名,密码

locales - Id(PK),descripcion,direccion等...

users_locales - user_id(K),local_id(K)

和实体类如下

用户

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

@Id
@GeneratedValue
private Integer id;

private String login;

private String password;


@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "user_locales", joinColumns = {@JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "local_id") })
private List<Local> userLocales = new ArrayList<Local>();

本地

@Entity  
@Table(name="locales")
public class Local {  

@Id  
@Column(name="id")
@GeneratedValue  
private Integer id;  
@Column(name="descripcion")
private String descripcion;  
@Column(name="direccion")
private String direccion;  


@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "user_locales", joinColumns = {@JoinColumn(name = "local_id") }, inverseJoinColumns = { @JoinColumn(name = "user_id") })
private List<User> localesUser = new ArrayList<User>();

我需要在jsp页面中使用选项select,该页面显示用户登录的“locals”合作伙伴列表,但我无法正确部署它。

这还没有完全开发出来,我做错了一件坏事,因为我无法完全理解hibernate和Spring安全是如何工作的。

需要在“UserService”中创建一个生成列表的服务,这就是我需要的帮助。

我添加了一些我认为可能需要执行此任务的代码段。

userService

public interface UserService {

public User getUser(String login);

}

localServiceImpl

 @Transactional
 public List<Local> listLocal() {

 return localDAO.listLocal();
 }

 //This just show a list of all Local objects in database

localDAOImpl

@Repository
public class LocalDAOImpl implements LocalDAO {
@Autowired
private SessionFactory sessionFactory;

public List<Local> listLocal() {
return sessionFactory.getCurrentSession().createQuery("from Local")
.list();
}

}

控制器

@RequestMapping(value="/index", method=RequestMethod.GET)
public ModelAndView indexPage( Map<String, Object> map ) {
    map.put("localList", localService.listLocal());
    return new ModelAndView("home");
}

//Now its pointing to localService and this list all objets in database

home.jsp文件

<select label="Locales" array="Locales" name="Locales">
    <c:forEach items="${localList}" var="local">
        <option value="${local.localidad}">
            <c:out value="${local.descripcion}"/>
        </option>
    </c:forEach>
</select>

我如何处理与当前用户会话相关的“区域设置”列表?对不起可能的拼写或语法错误。

1 个答案:

答案 0 :(得分:1)

目前你正在选择整张桌子。您需要修改localDAO.listLocal()并将登录作为参数传递,然后修改您的查询并使用该参数来限制输出记录:

public List<Local> listLocal(String userLogin) {
    Query query = sessionFactory.getCurrentSession()
          .createQuery("select u.userLocales from User u where u.login = ?");
    query.setParameter(0, userLogin);
    return query.list();
}

Hibernate,Spring或您使用的任何框架都不会自动限制数据。您需要自己为当前用户限制检索的数据。