Java 一对多层次对象结构在使用hibernate时无法持久化

Java 一对多层次对象结构在使用hibernate时无法持久化,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,总结: NewRide类有一个Route类的实例。Route类有一个SerializationLatLng类对象的集合。我正在尝试将NewRide对象持久化到数据库中,并期望在持久化NewRide的同时,Route和SerializationLatling也会因为级联而得到持久化 NewRide.hbm.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//H

总结:

NewRide类有一个Route类的实例。Route类有一个SerializationLatLng类对象的集合。我正在尝试将NewRide对象持久化到数据库中,并期望在持久化NewRide的同时,Route和SerializationLatling也会因为级联而得到持久化

NewRide.hbm.xml

    <?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="edu.nyu.cloud.beans.NewRide" table="ride" entity-name="ride">
        <id name="id" column="id" />
        <property name="requester" column="USER_NAME" type="java.lang.String" />
        <property name="source" column="source" type="java.lang.String" />
        <property name="destination" column="destination" type="java.lang.String" />
        <property name="timeOfTrip" column="timeOfTrip" type="java.sql.Date" />
        <many-to-one name="selectedRoute" column="r_id"
            cascade="persist" fetch="join" entity-name="route" not-null="true">
        </many-to-one>
    </class>

    <class name="edu.nyu.cloud.beans.Route" table="route"
        entity-name="route">
        <id name="id" type="long" column="r_id" />
        <component name="distance" class="edu.nyu.cloud.beans.SerializableDistance">
            <property name="inMeters" column="distance" type="long" />
        </component>
        <component name="timetaken" class="edu.nyu.cloud.beans.SerializableDuration">
            <property name="inSeconds" column="duration" type="long" />
        </component>
        <set name="latlng" inverse="true" cascade="persist" fetch="join"  table="latlng">
            <key column="r_id"  not-null="true"/>
            <one-to-many class="edu.nyu.cloud.beans.SerializableLatLng"
                entity-name="latlng" />
        </set>
    </class>

    <class name="edu.nyu.cloud.beans.SerializableLatLng" entity-name="latlng">
        <id name="id" type="long" column="id">
            <generator class="identity" />
        </id>
        <property name="lat" type="double" column="lat" />
        <property name="lng" type="double" column="lng" />
        <property name="routeId" type="long" column = "r_id" not-null="true"/>
    </class>

</hibernate-mapping>
原因:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`rideshare`.`latlng`, CONSTRAINT `FK_chp98lqa8608o464bhs6qpoyk` FOREIGN KEY (`r_id`) REFERENCES `route` (`r_id`))at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
                at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
                at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
                at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
                at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
                at com.mysql.jdbc.Util.getInstance(Util.java:381)
                at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
                at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
                at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
                at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
                at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
                at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
                at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2643)
                at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
                at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362)
                at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2280)
                at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2265)
                at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
                at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
                at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
            ... 104 common frames omitted
请查收 1.在latlng表中插入的r_id值应与route表中的r_id值相同。 2.路线表应在生成表格之前更新。

请检查 1.在latlng表中插入的r_id值应与route表中的r_id值相同。 2.路线表应在latlng表之前更新

public class SerializableLatLng implements Serializable {

    private static final long serialVersionUID = 3933584737903911424L;

    private long id;

    /**
     * The latitude of this location.
     */
    private double lat;

    /**
     * The longitude of this location.
     */
    private double lng;

    @JsonIgnore
    private long routeId;
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`rideshare`.`latlng`, CONSTRAINT `FK_chp98lqa8608o464bhs6qpoyk` FOREIGN KEY (`r_id`) REFERENCES `route` (`r_id`))at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
                at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
                at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
                at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
                at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
                at com.mysql.jdbc.Util.getInstance(Util.java:381)
                at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
                at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
                at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
                at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
                at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
                at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
                at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2643)
                at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
                at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362)
                at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2280)
                at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2265)
                at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
                at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
                at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
            ... 104 common frames omitted