Отображение значения в дБ на веб-странице с использованием спящего режима - PullRequest
0 голосов
/ 06 ноября 2011

У меня есть простое веб-приложение, которое извлекает все данные из таблицы базы данных и при нажатии отображает дополнительные сведения из других таблиц. Я использую Hibernate для отображения таблиц, но у меня возникла проблема с отображением значений из внешних ключей. Например, я хочу отобразить имя актера, связанное с фильмом, а не «movie.Actor@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>

мой текущий вывод: [movie.Actor@7b7bee, movie.Actor@10580fa, movie.Actor@3c6b88, movie.Actor@56a1b6]

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

любая помощь в этом была бы велика, спасибо

1 Ответ

0 голосов
/ 06 ноября 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...