仅在使用Thymeleaf

时间:2017-07-31 19:30:27

标签: java hibernate spring-mvc spring-data thymeleaf

我是Spring的新手,我正在尝试使用一些表单和视图构建一个简单的应用程序。 当我通过model.addAtribute("myObject", var)直接在模型中注入我的对象时,一切正常。这是一个例子: 我的方法addProjectForm在项目控制器中。用户必须选择经理(用户)和公司(公司):

    @RequestMapping(value = "/add")
public String addProjectForm(Model model) {
    List<User> users = userService.getAllUsers();
    List<Company> companies = companyService.getAllCompanies();
    Project project = new Project();
    model.addAttribute("users", users);
    model.addAttribute("companies", companies);
    model.addAttribute("project", project);
    return "editProject";
}

然后,所有内容都会在视图中显示为表单。我可以根据需要刷新此页面而不会出现任何错误。

到目前为止,没有什么花哨的......但是,当我尝试显示特定项目的页面时。该页面显示了项目的信息,他的经理和他的公司。控制器看起来像:

    @RequestMapping(value = "/view/{id}")
public  String viewProject(@PathVariable(value = "id") String id, Model model) {
    Long projectId = Long.valueOf(id);
    Project project = projectService.getProject(projectId);
    model.addAttribute("project", project);
    return "viewProject";
}

所以我调用projectService(实际上是接口)包含via:

@Autowired
ProjectService projectService;

和方法getProject

 /**
 * Created by SebUndefined on 21/07/17.
 */
@Service("projectService")
@Transactional(readOnly = true)
public class ProjectServiceImpl implements ProjectService {

@Autowired
private ProjectDAO projectDAO;

@Override
public Project getProject(Long id) {
    Project project = projectDAO.getProject(id);
    return project;
}
..... Other method

}

如果我是对的,那么@Transactionnal注释会照顾(在其他功能的中间)session.close(),使其在DAO HibernateProjectDAO(实际上是接口ProjectDAO)的池中再次可用

@Repository("projectDao")
public class HibernateProjectDAO implements ProjectDAO {

@Autowired
SessionFactory sessionFactory;

@Override
public Project getProject(Long id) {
    return (Project)sessionFactory.getCurrentSession().get(Project.class, id);
}
... Other method

}

对于我的实体,我使用FetchType.LAZY作为多对一关联。例如,项目只能在一个公司中==&gt;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_id")
@JsonManagedReference
private Company company;

然后,在我的模板中,即使使用此提取选项,我也可以按需加载公司名称,如下所示:

<td th:text="${project.company.name}">undefined</td>

Thymeleaf按需自己装载它。然后在这种情况下,我在刷新后得到此错误

org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-nio-8080-exec-5] Timeout: Pool empty. Unable to fetch a connection in 3 seconds, none available[size:20; busy:20; idle:0; lastwait:3000].

仅当我加载未加载到控制器中的实体并且错误直接链接到设置spring.datasource.tomcat.max-active = XX之前允许的刷新次数时才会出现。

放10000000很容易,但它只适用于aprox 10000000请求:)。

据我所知,在模板中获取关联实体之后,看起来Thymeleaf没有关闭事务(使其在池中可用)...

有没有人以前遇到过这个问题?我将不胜感激一些帮助:)

提前致谢!

0 个答案:

没有答案