2014-10-16 2 views
0

У меня есть два объекта Статья и категория. Существует много-много отношений. В базе данных я использую промежуточную таблицу для этого - article_category, как на картинке.JSP-файл не извлекает данные из таблицы с многими-ко-многим (спящий режим)

http://i.stack.imgur.com/Qji5u.jpg

Когда я использую OneToMany связь между объектами другого в моем проекте, это работает. У меня проблемы только с ManyToMany. Я хотел бы получить название категории соответствующей статьи, когда я пытаюсь в jsp-файле в конце гостевой комнаты. Что я делаю неправильно?

Существует мой код:

Article.class

@Entity 
public class Article { 
@Id 
@GeneratedValue 
private Integer id; 

private String title; 
private String content; 
private Date publishDate; 

@ManyToOne 
@JoinColumn(name = "user_id") 
private User user; 

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "article_category", 
joinColumns={@JoinColumn(name="article_id")}, 
inverseJoinColumns={@JoinColumn(name="category_id")}) 
private List<Category> categories; 

public Integer getId() { 
    return id; 
} 
public void setId(Integer id) { 
    this.id = id; 
} 
public String getTitle() { 
    return title; 
} 
public void setTitle(String title) { 
    this.title = title; 
} 
public String getContent() { 
    return content; 
} 
public void setContent(String content) { 
    this.content = content; 
} 
public Date getPublishDate() { 
    return publishDate; 
} 
public void setPublishDate(Date publishDate) { 
    this.publishDate = publishDate; 
} 
public User getUser() { 
    return user; 
} 
public void setUser(User user) { 
    this.user = user; 
} 
public List<Category> getCategories() { 
    return categories; 
} 
public void setCategories(List<Category> categories) { 
    this.categories = categories; 
} } 

Category.class

@Entity 
public class Category { 
@Id 
@GeneratedValue 
private Integer id; 
private String name; 

@ManyToMany(mappedBy = "categories") 
private List<Article> articles; 

public Integer getId() { 
    return id; 
} 
public void setId(Integer id) { 
    this.id = id; 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public List<Article> getArticles() { 
    return articles; 
} 
public void setArticles(List<Article> articles) { 
    this.articles = articles; 
}} 

IndexController.class

@Controller 

общественного класса IndexController {

@Autowired 
UserService userService; 

@Autowired 
CategoryService categoryService; 

@Autowired 
ArticleService articleService; 

@RequestMapping("/index") 
public String index(Model model) { 
    model.addAttribute("users", userService.findAll()); 
    model.addAttribute("categories", categoryService.findAll()); 
    model.addAttribute("articles", articleService.findAll()); 
    return "index"; 
} 


@RequestMapping("/article/{id}") 
public String ArticleDetail(Model model, @PathVariable Integer id) { 
    Article article = articleService.findById(id); 
    model.addAttribute("article1", article); 
    return "index"; 
}} 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" 
pageEncoding="UTF-8"%> 
<%@ include file="../layouts/taglibs.jsp"%> 
<div class="blog-post"> 
<c:forEach items="${articles}" var="article"> 
    <h2 class="blog-post-title">${article.title}</h2> 
    <p class="blog-post-meta">${article.publishDate}</p> 
    <p>${article.content}</p> 
</c:forEach> 
<p>${article1.user.name}</p> 
<p>${article1.user.email}</p> 
<p>${article1.category.name}</p> <!-- IT DOES NOT WORK --> 
</div> 

ответ

0

Главной ошибкой было то, когда я не добавить этот фильтр в web.xml

<filter> <filter-name>OpenSessionInViewFilter</filter-name> 
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter‌​</filter-class> </filter> 
<filter-mapping> < 
filter-name>OpenSessionInViewFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

Он отлично работает на данный момент.

1

Вы должны изменить JSP, потому что с многие ко многим отношений, статья имеет коллекцию категорий (категории), а не одну категорию (категорию). Вам понадобится цикл.

UPDATE

что-то подобное, а:

<p><c:forEach items="${article1.categories}" var="cat">${cat.name} </c:forEach></p> 
+0

См. Обновление выше –

+0

Это все еще не работает :(Я попробовал это и то же исключение. Не могу понять, что может быть неправильным. –

+0

Я решил это сам, когда добавил ** fetch = FetchType.EAGER ** to ** @ ManyToMany ** аннотация. –

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

  • Нет связанных вопросов^_^