Отображение значения из базы данных на веб-странице с использованием гибернации

#java #mysql #hibernate #web

#java #mysql #режим гибернации #веб

Вопрос:

У меня есть простое веб-приложение, которое извлекает все записи из таблицы БД и при нажатии на них показывает более подробную информацию из других таблиц. Я использую режим гибернации для сопоставления таблиц, но у меня возникла проблема с отображением значений из внешних ключей. Например, я хочу отобразить имя актера, связанное с фильмом, вместо «movie.Актер @5514f9»

  <h:outputText value="Actors"/>
    <h:outputText value="#{movieController.selected.actors}" title="Actors"/>
  

Это код, который я использую для отображения значений.

Мой класс movieController

 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package movie;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;


/**
 *
 * @author Shane
 */
@ManagedBean(name = "movieController")
@SessionScoped
public class MovieController {

int startId;
int endId;
DataModel movieTitles;
MovieHelper helper;
//private int recordCount = 1000;
private int pageSize = 10;

private Movie current;
private int selectedItemIndex;

public List getActors() {
    List actors = new ArrayList();

    return actors;
}

/** Creates a new instance of MovieController */
public MovieController() {
    helper = new MovieHelper();
    startId = 1;
    endId = 1000000;
}

public MovieController(int startId, int endId) {
    helper = new MovieHelper();
    this.startId = startId;
    this.endId = endId;
}

public Movie getSelected() {
    if (current == null) {
        current = new Movie();
        selectedItemIndex = -1;
    }
    return current;
}

public DataModel getMovieTitles() {
    if (movieTitles == null) {
        movieTitles = new ListDataModel(helper.getMovieTitles(startId, endId));
    }
    return movieTitles;
}

void recreateModel() {
    movieTitles = null;
}

//  The following methods that are used for page navigation
    public boolean isHasNextPage() {
    helper = new MovieHelper();

    if (endId   pageSize <= helper.getRecordCount()) {
        return true;
    }
    return false;
}

public boolean isHasPreviousPage() {
    if (startId - pageSize > 0) {
        return true;
    }
    return false;
}

public String next() {
    startId = endId   1;
    endId = endId   pageSize;
    recreateModel();
    return "index";
}

public String previous() {
    startId = startId - pageSize;
    endId = endId - pageSize;
    recreateModel();
    return "index";
}

public int getPageSize() {
    return pageSize;
}

public String prepareView() {
    current = (Movie) getMovieTitles().getRowData();
    return "browse";
}

public String prepareList() {
    recreateModel();
    return "index";
    }
}
  

И мой Movie.hbm.xml файл является

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 26-Oct-2011 22:41:19 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
<class name="movie.Movie" table="movie" catalog="movieserver">
    <id name="id" type="int">
        <column name="Id" />
        <generator class="assigned" />
    </id>
    <property name="title" type="string">
        <column name="Title" length="75" />
    </property>
    <property name="rating" type="string">
        <column name="Rating" length="25" />
    </property>
    <property name="plot" type="string">
        <column name="Plot" />
    </property>
    <property name="poster" type="string">
        <column name="Poster" length="150" />
    </property>
    <property name="runtime" type="string">
        <column name="Runtime" length="15" />
    </property>
    <property name="votes" type="string">
        <column name="Votes" length="15" />
    </property>
    <property name="released" type="string">
        <column name="Released" length="15" />
    </property>
    <property name="year" type="string">
        <column name="Year" length="15" />
    </property>
    <property name="rated" type="string">
        <column name="Rated" length="15" />
    </property>
    <property name="director" type="string">
        <column name="Director" length="100" />
    </property>
    <set name="genres" inverse="false" table="movie_genre">
        <key>
            <column name="MovieId" not-null="true" />
        </key>
        <many-to-many entity-name="movie.Genre">
            <column name="GenreId" not-null="true" />
        </many-to-many>
    </set>
    <set name="writers" inverse="false" table="movie_writer">
        <key>
            <column name="MovieId" not-null="true" />
        </key>
        <many-to-many entity-name="movie.Writer">
            <column name="WriterId" not-null="true" />
        </many-to-many>
    </set>
    <set name="actors" inverse="false" table="movie_actor">
        <key>
            <column name="MovieId" not-null="true" />
        </key>
        <many-to-many entity-name="movie.Actor">
            <column name="ActorId" not-null="true" />
        </many-to-many>
        </set>
    </class>
</hibernate-mapping>
  

мой текущий вывод:
[фильм.Актер @7b7bee, фильм.Актер @ 10580fa, фильм.Актер @3c6b88, фильм.Актер@56a1b6]

но мне интересно, как отобразить имя актера вместо индекса актера?

любая помощь по этому вопросу была бы отличной, спасибо

Ответ №1:

Actors — это коллекция (набор) в вашем случае. Вы должны повторить набор актеров throw и отобразить имя для каждого актера в коллекции.

"[<className>@<hashCode1>, <className>@<hashCode2>, ...]" — это строка, которая использует метод AbstractCollection.Возвращает toString() (набор актеров фильма — AbstractCollection).

В свою очередь "<className>@<hashCode>" — это строка, которую возвращает метод Object.toString() (объект класса movie.Актер).

Вы могли бы переопределить метод movie.Actor#toString() и заставить его возвращать имя актера. Затем ваша страница отобразит строку следующим образом: "[actor name1, actor name2, ...]" .

Но правильный подход заключается в использовании компонентов JSF, таких как <h:dataTable .../> или перебор набора актеров с помощью JSTL <c:forEach .../> .

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

1. спасибо за ответ, я понимаю, что использую коллекцию, но я надеялся, что мне не придется перебирать их. В настоящее время для моего кода <h: outputText value=»Actors»/> <h:outputText value=»#{movieController.selected.actors}» title=»Актеры» /> вывод в моем браузере: [фильм. Актер @7b7bee, фильм. Актер @ 10580fa, фильм. Актер @3c6b88, фильм. Актер@56a1b6] но я надеялся отобразить имя вместо индексного кода, какие-либо предложения?