#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] но я надеялся отобразить имя вместо индексного кода, какие-либо предложения?