Я новичок в GAE, GWT, Hibernate и JDO.У меня есть Bus
, BusStop
и Route
классы, которые сериализуются следующим образом:
BaseObject.java
package org.symphony.suchitra.gae.client.admin.model;
import java.io.Serializable;
public interface BaseObject extends Serializable {
String getId();
}
Bus.java
@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class Bus implements BaseObject {
@PrimaryKey
@Persistent(valueStrategy =IdGeneratorStrategy.IDENTITY)
protected Long id;
public String getId() {
if( id == null ) {
return null;
}
return id.toString();
}
public void setId(Long id) {
this.id = id;
}
@Persistent
protected String busNumber;
@Persistent
@Unique
protected String busIdentifier;
@Persistent
protected String routeId;
public String getBusNumber() {
return busNumber;
}
public void setBusNumber(String busNumber) {
this.busNumber = busNumber;
}
public String getBusIdentifier() {
return busIdentifier;
}
public void setBusIdentifier(String busIdentifier) {
this.busIdentifier = busIdentifier;
}
public String getRouteId() {
return routeId;
}
public void setRouteId(String routeId) {
this.routeId = routeId;
}
}
BusStop.java
@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class BusStop implements BaseObject{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
protected Long ident;
public String getId() {
if( ident == null ) {
return null;
}
return ident.toString();
}
public void setId(String id) {
this.ident = Long.parseLong(id);
}
@Persistent
@Unique
private String name;
@Persistent
private String latitude;
@Persistent
private String longitude;
public String getLatitude() {
return latitude;
}
public void setLatitude(String email) {
this.latitude = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLongitude() {
return longitude;
}
public void setLongitude(String password) {
this.longitude = password;
}
}
Route.java
@PersistenceCapable (identityType=IdentityType.APPLICATION)
public class Route implements BaseObject{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
protected Long id;
public String getId() {
if( id == null ) {
return null;
}
return id.toString();
}
public void setId(String id) {
this.id = Long.parseLong(id);
}
@Persistent
private String name;
@Persistent
private String sourceId;
@Persistent
private String destinationId;
public String getSourceId() {
return sourceId;
}
public void setSourceId(String source) {
this.sourceId = source;
}
public String getDestinationId() {
return destinationId;
}
public void setDestinationId(String destinationId) {
this.destinationId = destinationId;
}
@Persistent
private String totalDistance;
@Persistent
private String totalTime;
@Persistent
private List<Long> busStopKeys;
@NotPersistent
private List<BusStop> busStops;
public String getTotalTime() {
return totalTime;
}
public void setTotalTime(String totalTime) {
this.totalTime = totalTime;
}
public List<BusStop> getBusStops() {
return busStops;
}
public void setBusStops(List<BusStop> busStops) {
this.busStops = busStops;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTotalDistance() {
return totalDistance;
}
public void setTotalDistance(String totalDistance) {
this.totalDistance = totalDistance;
}
public List<Long> getBusStopKeys() {
return busStopKeys;
}
public void setBusStopKeys(List<Long> busStopKeys) {
this.busStopKeys = busStopKeys;
}
}
Отображения гибернации:
bus.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.symphony.suchitra.gae.client.admin.model.Bus" table="bus">
<id column="bus_id" name="bus_id" type="java.lang.String">
<generator class="org.hibernate.id.UUIDHexGenerator">
</generator>
</id>
<property name="bus_number"/>
<property name="bus_identifier" unique="true"/>
<property name="route_id"/>
</class>
</hibernate-mapping>
busstop.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.symphony.suchitra.gae.client.admin.model.BusStop" table="busstop">
<id column="busstop_id" name="busstop_id" type="java.lang.String">
<generator class="org.hibernate.id.UUIDHexGenerator">
</generator>
</id>
<property name="name"/>
<property name="latitude"/>
<property name="longitude"/>
</class>
</hibernate-mapping>
route.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.symphony.suchitra.gae.client.admin.model.Route">
<id column="route_id" name="route_id" type="java.lang.String">
<generator class="org.hibernate.id.UUIDHexGenerator">
</generator>
</id>
<property name="name"/>
<property name="source"/>
<property name="destination"/>
<property name="total_distance"/>
<property name="total_time"/>
<list name="busstoplist" table="busstoplist" cascade="save-update">
<key column="route_id"/>
<list-index column="busstoplist_id"/>
<many-to-many class="org.symphony.suchitra.gae.client.admin.model.BusStop" column="busstop_id"/>
</list>
</class>
</hibernate-mapping>
Здесь маршруты и автобусные остановки имеют много-много взаимосвязей, и у каждого автобуса есть маршрут.Я просто сохраняю идентификатор маршрута в автобусе, но затем, получая объект шины, выдает следующую ошибку
com.google.gwt.user.client.rpc.SerializationException: Тип 'org.datanucleus.sco.backed.ArrayList' не был включен в набор типов, которые могут быть сериализованы этим SerializationPolicy, или его объект Class не может быть загружен.В целях безопасности этот тип не будет сериализован .: экземпляр
Во время хранения не возникает проблем.Теперь я не имею дело непосредственно с ArrayList в объекте Bus.Так что я не могу понять, где манипулировать объектом ArrayList datanucleus, чтобы использовать ArrayList.
Более того, когда я сохраняю идентификатор busstop в таблице шин вместо идентификатора маршрута, программа работает нормально.После получения объекта автобуса, я показываю его детали.При этом я получаю поле имени объекта маршрута через RouteDAO.
Пожалуйста, помогите мне ...