Отношение «многие ко многим» в Java Spring — индекс выходит за пределы, ArrayIndexOutOfBoundsException для PersistentSet ⇐ JAVA
-
Anonymous
Отношение «многие ко многим» в Java Spring — индекс выходит за пределы, ArrayIndexOutOfBoundsException для PersistentSet
Я создаю простое приложение, используя Java Spring.
У меня возникла проблема при попытке построить связь «многие ко многим». У меня есть следующие объекты:
Пользователь
@Entity @Table(name = "пользователи") публичный класс пользователя { @Идентификатор @GeneratedValue частный длинный идентификатор; ... @OneToMany(mappedBy = "пользователь") частный Set назначенныйItemUsers = новый HashSet(); ... } Элемент
@Entity @Table(name = "items", uniqueConstraints = { @UniqueConstraint(columnNames = { "slug" })}) публичный класс Item { @Идентификатор @GeneratedValue частный длинный идентификатор; ... @OneToMany(mappedBy = "элемент") частный Set назначенныйItemUsers = новый HashSet(); ... } И объединяющая таблица:
AssignedItemUser
@Entity @Table(name = "new_assigned_item_users") общественный класс AssignedItemUser { @Идентификатор частный идентификатор BigInteger; @ManyToOne @JoinColumn(name = "user_id") Пользователь Пользователь; @ManyToOne @JoinColumn(name = "item_id") Товар предмет; } Когда я проверяю ассоциацию на стороне элемента — она работает. например.
item.getAssignedItemUsers().size() //101 Однако на стороне пользователя я получаю сообщение об ошибке:
user.getAssignedItemUsers().size() /// ArrayIndexOutOfBoundsException@132 "java.lang.ArrayIndexOutOfBoundsException: Индекс 3 выходит за пределы для длины 3" Простите за глупость, но в Интернете я не нашел ничего полезного, трассировка стека тоже бесполезна.
Я делаю что-то не так? Я не могу понять, чего мне здесь не хватает.
Изменить: поэтому я вызвал printStackTrace() для исключения:
java.lang.ArrayIndexOutOfBoundsException: индекс 3 выходит за пределы для длины 3 в org.hibernate.type.descriptor.java.EnumJavaType.fromInteger(EnumJavaType.java:178) в org.hibernate.type.descriptor.java.EnumJavaType.fromOrdinal(EnumJavaType.java:195) в org.hibernate.metamodel.model.convert.internal.OrdinalEnumValueConverter.toDomainValue(OrdinalEnumValueConverter.java:52) в org.hibernate.metamodel.model.convert.internal.OrdinalEnumValueConverter.toDomainValue(OrdinalEnumValueConverter.java:29) в org.hibernate.sql.results.graph.basic.BasicResultAssembler.assemble(BasicResultAssembler.java:80) в org.hibernate.sql.results.graph.DomainResultAssembler.assemble(DomainResultAssembler.java:33) в org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.extractConcreteTypeStateValues(AbstractEntityInitializer.java:1037) в org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.initializeEntity(AbstractEntityInitializer.java:831) в org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.initializeInstance(AbstractEntityInitializer.java:787) в org.hibernate.sql.results.internal.StandardRowReader.coordinateInitializers(StandardRowReader.java:152) в org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:97) в org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:178) в org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33) в org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:443) в org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:166) в org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:91) в org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31) в org.hibernate.loader.ast.internal.CollectionLoaderSingleKey.load(CollectionLoaderSingleKey.java:121) в org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:789) в org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:75) в org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) в org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1710) в org.hibernate.collection.spi.AbstractPersistentCollection.lambda$initialize$3(AbstractPersistentCollection.java:617) в org.hibernate.collection.spi.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:265) в org.hibernate.collection.spi.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:615) в org.hibernate.collection.spi.AbstractPersistentCollection.read(AbstractPersistentCollection.java:136) в org.hibernate.collection.spi.PersistentSet.toString(PersistentSet.java:295) Поскольку он вызывает EnumJavaType, возможно, стоит отметить, что модели Item и User имеют поля перечисления, но в AssignedItemUser поле перечисления отсутствует.
Наконец, основной причиной проблемы оказался целочисленный столбец базы данных, сопоставленный с перечислением на стороне Java. Поскольку значения в столбце не были последовательными (0, 2, 3), они не соответствовали типу перечисления ORDINAL на конце Java. Добавление конвертера решило проблему.
Я создаю простое приложение, используя Java Spring.
У меня возникла проблема при попытке построить связь «многие ко многим». У меня есть следующие объекты:
Пользователь
@Entity @Table(name = "пользователи") публичный класс пользователя { @Идентификатор @GeneratedValue частный длинный идентификатор; ... @OneToMany(mappedBy = "пользователь") частный Set назначенныйItemUsers = новый HashSet(); ... } Элемент
@Entity @Table(name = "items", uniqueConstraints = { @UniqueConstraint(columnNames = { "slug" })}) публичный класс Item { @Идентификатор @GeneratedValue частный длинный идентификатор; ... @OneToMany(mappedBy = "элемент") частный Set назначенныйItemUsers = новый HashSet(); ... } И объединяющая таблица:
AssignedItemUser
@Entity @Table(name = "new_assigned_item_users") общественный класс AssignedItemUser { @Идентификатор частный идентификатор BigInteger; @ManyToOne @JoinColumn(name = "user_id") Пользователь Пользователь; @ManyToOne @JoinColumn(name = "item_id") Товар предмет; } Когда я проверяю ассоциацию на стороне элемента — она работает. например.
item.getAssignedItemUsers().size() //101 Однако на стороне пользователя я получаю сообщение об ошибке:
user.getAssignedItemUsers().size() /// ArrayIndexOutOfBoundsException@132 "java.lang.ArrayIndexOutOfBoundsException: Индекс 3 выходит за пределы для длины 3" Простите за глупость, но в Интернете я не нашел ничего полезного, трассировка стека тоже бесполезна.
Я делаю что-то не так? Я не могу понять, чего мне здесь не хватает.
Изменить: поэтому я вызвал printStackTrace() для исключения:
java.lang.ArrayIndexOutOfBoundsException: индекс 3 выходит за пределы для длины 3 в org.hibernate.type.descriptor.java.EnumJavaType.fromInteger(EnumJavaType.java:178) в org.hibernate.type.descriptor.java.EnumJavaType.fromOrdinal(EnumJavaType.java:195) в org.hibernate.metamodel.model.convert.internal.OrdinalEnumValueConverter.toDomainValue(OrdinalEnumValueConverter.java:52) в org.hibernate.metamodel.model.convert.internal.OrdinalEnumValueConverter.toDomainValue(OrdinalEnumValueConverter.java:29) в org.hibernate.sql.results.graph.basic.BasicResultAssembler.assemble(BasicResultAssembler.java:80) в org.hibernate.sql.results.graph.DomainResultAssembler.assemble(DomainResultAssembler.java:33) в org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.extractConcreteTypeStateValues(AbstractEntityInitializer.java:1037) в org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.initializeEntity(AbstractEntityInitializer.java:831) в org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.initializeInstance(AbstractEntityInitializer.java:787) в org.hibernate.sql.results.internal.StandardRowReader.coordinateInitializers(StandardRowReader.java:152) в org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:97) в org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:178) в org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33) в org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:443) в org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:166) в org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:91) в org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31) в org.hibernate.loader.ast.internal.CollectionLoaderSingleKey.load(CollectionLoaderSingleKey.java:121) в org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:789) в org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:75) в org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) в org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1710) в org.hibernate.collection.spi.AbstractPersistentCollection.lambda$initialize$3(AbstractPersistentCollection.java:617) в org.hibernate.collection.spi.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:265) в org.hibernate.collection.spi.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:615) в org.hibernate.collection.spi.AbstractPersistentCollection.read(AbstractPersistentCollection.java:136) в org.hibernate.collection.spi.PersistentSet.toString(PersistentSet.java:295) Поскольку он вызывает EnumJavaType, возможно, стоит отметить, что модели Item и User имеют поля перечисления, но в AssignedItemUser поле перечисления отсутствует.
Наконец, основной причиной проблемы оказался целочисленный столбец базы данных, сопоставленный с перечислением на стороне Java. Поскольку значения в столбце не были последовательными (0, 2, 3), они не соответствовали типу перечисления ORDINAL на конце Java. Добавление конвертера решило проблему.
Мобильная версия