Spring MVC и спящий режим: как распечатать поля, соединенные слева?

#java #hibernate #spring-mvc

#java #переход в спящий режим #spring-mvc

Вопрос:

Я новичок в Spring (MVC) и спящем режиме… У меня возникла следующая проблема:

Я разрабатываю RSS-приложение, которое вкратце анализирует RSS-канал, сохраняет поля в базе данных и отображает информацию RSS на веб-странице.

В некоторых RSS-каналах появилось изображение. У меня нет проблем с их анализом и сохранением, но у меня возникла проблема с отображением их вместе с информацией RSS. Информация RSS хранится в одной таблице (поля: идентификатор, заголовок, описание, URL, ссылка, язык, дата), в то время как информация об изображении RSS хранится в другой таблице (поля: идентификатор, заголовок, описание, URL, высота, ширина, rss_id). Должно быть взаимно однозначное отношение.

Мой запрос гибернации для восстановления всего RSS выглядит следующим образом и работает:

 public List<RSS> getAllRSS() {
    return getHibernateTemplate().find("from RSS as rss left join fetch rss.rssImage as image");
}
  

Для распечатки информации RSS я использую следующий код:

 RSSService rssService = (RSSService) ctx.getBean("rssService");
RSS rss = new RSS();
List list = rssService.listAllRSS();

Iterator i = list.iterator();
while(i.hasNext()){
            rss = (RSS) i.next();
            System.out.println("rss title:"   rss.getTitle());
}
  

И это работает. Но как я могу повторно получить поля из изображения?

Класс RSS:

 public class RSS {

private Integer id;
private String title;
private Date dateCreated;
private String description;
private String link;
private String url;
private String language;
private String rating;
private Date dateModified;
private Set rssItems;
private Set rssImage;

/**
 * @return the id
 */
public Integer getId() {
    return id;
}

/**
 * @param id the id to set
 */
public void setId(Integer id) {
    this.id = id;
}

public Date getDateCreated() {
    return dateCreated;
}

public void setDateCreated(Date dateCreated) {
    this.dateCreated = dateCreated;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public Date getDateModified() {
    return dateModified;
}

public void setDateModified(Date dateModified) {
    this.dateModified = dateModified;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getLanguage() {
    return language;
}

public void setLanguage(String language) {
    this.language = language;
}

public String getLink() {
    return link;
}

public void setLink(String link) {
    this.link = link;
}

public String getRating() {
    return rating;
}

public void setRating(String rating) {
    this.rating = rating;
}

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}

/**
 * @return the rssItems
 */
public Set getRssItems() {
    return rssItems;
}

/**
 * @param rssItems the rssItems to set
 */
public void setRssItems(Set rssItems) {
    this.rssItems = rssItems;
}

/**
 * @return the rssImage
 */
public Set getRssImage() {
    return rssImage;
}

/**
 * @param rssImage the rssImage to set
 */
public void setRssImage(Set rssImage) {
    this.rssImage = rssImage;
}
}
  

Класс RSS-изображения:

 public class RSSImage {

private Integer id;
private String title;
private String url;
private String description;
private String width;
private String height;
private Date dateCreated;
private Date dateModified;
private RSS rss;

/**
 * @return the id
 */
public Integer getId() {
    return id;
}

/**
 * @param id the id to set
 */
public void setId(Integer id) {
    this.id = id;
}

/**
 * @return the title
 */
public String getTitle() {
    return title;
}

/**
 * @param title the title to set
 */
public void setTitle(String title) {
    this.title = title;
}

/**
 * @return the url
 */
public String getUrl() {
    return url;
}

/**
 * @param url the url to set
 */
public void setUrl(String url) {
    this.url = url;
}

/**
 * @return the description
 */
public String getDescription() {
    return description;
}

/**
 * @param description the description to set
 */
public void setDescription(String description) {
    this.description = description;
}

/**
 * @return the width
 */
public String getWidth() {
    return width;
}

/**
 * @param width the width to set
 */
public void setWidth(String width) {
    this.width = width;
}

/**
 * @return the height
 */
public String getHeight() {
    return height;
}

/**
 * @param height the height to set
 */
public void setHeight(String height) {
    this.height = height;
}

/**
 * @return the dateCreated
 */
public Date getDateCreated() {
    return dateCreated;
}

/**
 * @param dateCreated the dateCreated to set
 */
public void setDateCreated(Date dateCreated) {
    this.dateCreated = dateCreated;
}

/**
 * @return the dateModified
 */
public Date getDateModified() {
    return dateModified;
}

/**
 * @param dateModified the dateModified to set
 */
public void setDateModified(Date dateModified) {
    this.dateModified = dateModified;
}

/**
 * @return the rss
 */
public RSS getRss() {
    return rss;
}

/**
 * @param rss the rss to set
 */
public void setRss(RSS rss) {
    this.rss = rss;
}
}
  

Спасибо 🙂

Комментарии:

1. Как выглядит ваш файл отображения гибернации? Учитывая объект RSS с именем rss, вам просто нужно правильно настроить его, чтобы поля в другой таблице отображались как rss.image.url и т.д.

Ответ №1:

Ваш RSS-образ отображен как коллекция, а не как отношение «один к одному». Итак, вам нужно выполнить итерацию по вашей коллекции изображений, чтобы распечатать каждое отдельное изображение.

В противном случае обновите свои сопоставления, чтобы rssImage был всего лишь одним изображением.

Ответ №2:

В вашем jsp:

  <table>
 <c:forEach var="rssItem" items="${rss}">
  <tr>
   <td>
     ${rssItem.name}
   </td> 
  </tr>
 </c:forEach>
</table>
  

затем в вашем контроллере

 @RequestMapping(value = "/something")
public ModelAndView getRSS () {
ModelAndView mv = new ModelAndView("someJSP.jsp");
List<RSS> rss = //get your RSS from Hibernate
mv.addObject("rss",rss);
return mv;   
}
  

Комментарии:

1. Информация об изображении rss содержит только файлы типа string, например заголовок, URL, высота, ширина. Применимо ли то же самое к таким полям? Похоже, ваш пример показывает, как распечатать изображение, а не только обычные строки….

2. Тогда я не понимаю вашего вопроса. Вы пытаетесь получить изображение в виде байта []? какие у вас элементы? не могли бы вы, пожалуйста, опубликовать свои классы?

3. О …. извините. Я добавил свои классы RSS и RSS image. Надеюсь, вы поймете 🙂 Я просто пытаюсь распечатать атрибуты из изображения RSS вместе с атрибутами из RSS, но я не знаю, как добраться до атрибутов изображения RSS.

4. @йорген, прости. Я думал, что вы задаете гораздо более сложный вопрос. Немного поздно, но смотрите Мой обновленный ответ 🙂