Una solución al error org.hibernate.HibernateException: columna de índice nulo para la colección: excepción en hibernación

Directorio de artículos


Causa

Cuando se usa Hibernate para implementar el mapeo de asociación de uno a muchos, hay una clase de Usuario y una clase de Orden.
La clase de usuario y la clase de pedido tienen una relación de uno a varios. Hay un atributo de lista en la clase de usuario para almacenar la información de pedido correspondiente al usuario.

public class User {
    
    
	private Integer id;
	private String userName;
	private String password;
	private List orderList = new ArrayList<>()	
}

Un error encontrado cuando se usa Hibernate para configurar el almacenamiento ordenado de los pedidos del mismo usuario a través de la etiqueta <List>.

        <list name="orderList" cascade="delete">
        	<key column="USER_ID"/>
        	<index column="index11"/>
        	<one-to-many class="Order"/>
        </list>
Hibernate: 
    select
        user0_.id as id1_1_0_,
        user0_.name as name2_1_0_,
        user0_.password as password3_1_0_ 
    from
        hibernate_05_02_user user0_ 
    where
        user0_.id=?
User [id=3, userName=李四, password=77777]
Hibernate: 
    select
        orderlist0_.USER_ID as USER_ID3_0_0_,
        orderlist0_.id as id1_0_0_,
        orderlist0_.index11 as index4_0_,
        orderlist0_.id as id1_0_1_,
        orderlist0_.price as price2_0_1_ 
    from
        hibernate_05_02_orders orderlist0_ 
    where
        orderlist0_.USER_ID=?
Exception in thread "main" org.hibernate.HibernateException: null index column for collection: com.hibernate.entity.User.orderList
	at org.hibernate.persister.collection.AbstractCollectionPersister.readIndex(AbstractCollectionPersister.java:847)
	at org.hibernate.collection.internal.PersistentList.readFrom(PersistentList.java:372)
	at org.hibernate.loader.plan.exec.process.internal.CollectionReferenceInitializerImpl.finishUpRow(CollectionReferenceInitializerImpl.java:77)
	at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:121)
	at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:122)
	at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122)
	at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86)
	at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:87)
	at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:688)
	at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:75)
	at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2183)
	at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:565)
	at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:247)
	at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:561)
	at org.hibernate.collection.internal.AbstractPersistentCollection.write(AbstractPersistentCollection.java:392)
	at org.hibernate.collection.internal.PersistentList.add(PersistentList.java:151)
	at com.hibernate.ui.Test.addOrder(Test.java:62)
	at com.hibernate.ui.Test.main(Test.java:18)

la razón

Cuando Hibernate juzga el índice de los datos de pedido recién insertados del Usuario A, primero consultará en la base de datos el índice más grande de los atributos de Lista existentes del Usuario A. Si el Usuario A realiza un pedido por primera vez, consúltelo en la tabla de pedidos. Si los datos de la orden del usuario A no están disponibles, se creará automáticamente una nueva Orden de datos y el valor predeterminado se establece en 0 en la columna de la esquina. Si el usuario A no está realizando una orden por primera vez, Hibernate consultará los datos anteriores. del usuario A en la tabla de pedidos. Si no puede encontrar el número de etiquetas de esquina, no puede juzgar la longitud que deben tener las etiquetas de esquina de los nuevos datos y se informará de este error.

Solución

En la tabla de la base de datos de pedidos, la última etiqueta de pedido del usuario A se puede establecer manualmente en un número.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_44627608/article/details/115050507
Recomendado
Clasificación