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.