powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как в Hibernate отобразить array объектов?
18 сообщений из 18, страница 1 из 1
Как в Hibernate отобразить array объектов?
    #39632540
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

В данный момент с целью самообразования изучаю Hibernate, так что просьба громко не пинать.

Дано: Java 8, Hibernate 5.
Есть класс промышленного девайса и класс адресуемого регистра:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
public class Device 
{
	public static final int ADDRESSCOUNT = 64 * 1024;
	
	public static final int BEGINOPERATIVEHOLDINGADDRESS = 0x0000;
	public static final int ENDOPERATIVEHOLDINGADDRESS = 0x09FF;
	
	protected HoldingRegister[] holdingregisterarray; // RW
	
	protected short modbusaddress;
	
	public Device(short modbusaddress)
	{
		this.modbusaddress = modbusaddress;
		this.holdingregisterarray = new HoldingRegister[ADDRESSCOUNT];
		
		for (int i = BEGINOPERATIVEHOLDINGADDRESS;i < ENDOPERATIVEHOLDINGADDRESS;i++)
		{
			this.holdingregisterarray[i] = new HoldingRegister(i);
		}
	}

}

public class HoldingRegister
{
  protected int address;
  protected boolean writable;
  
  public int getAddress() { return address; }
  public boolean getWritable() { return writable; }
  
  public HoldingRegister(int address)
  {
    this.address = address;
    this.writable = true;
  }
}



Как Гибернейт может отмапить массив (обычный array) объектов класса HoldingRegister в таблицу?

Знаю, что обычно в данном случае применяются коллекции. Но стандартные коллекции с интерфейсом RandomAccess здесь не подходят по скорости работы. Индекс в массиве является адресом регистра, который приходит в сетевом пакете (протокол MODBUS). При этом обращения к регистрам регулярное и частое.

Если отмапить массив объектов непосредственно нельзя, предполагаю задействовать вспомогательную коллекцию для загрузки объектов HoldingRegister и инициализации массива для работы (в конструкторе Device). Сохранять эти объекты нужно только в деструкторе класса Device. Так делать целесообразно?
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632567
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frame RelayНо стандартные коллекции с интерфейсом RandomAccess здесь не подходят по скорости работы.хибер работает с CRUD задачами.
Если скорость работы с таблицей в виде коллекции вас не устраивает то вам не нужен ОРМ и хибер.
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632596
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сохранение состояния прибора в базе и восстановление из базы разве не относятся к категории CRUD?
Там ещё может быть сохранение диапазона регистров (область уставок прибора) для имитации ЭНЗУ. Причём довольно частые.
А работу с регистрами (читать-писать) и с сетью по промышленному протоколу можно считать бизнес-логикой (собственно полезной работой).

Просто стандартные примеры (всякие магазины-аукционы-etc) скучны и банальны, да и разработка эмулятора для собственных нужд позволяет сочетать приятное с полезным.

Но меня интересует именно вопрос отображения в таблицу массива объектов. Возможно ли такое вообще или только через промежуточную коллекцию? Мало ли что потом могут спросить на собеседовании.
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632601
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frame Relayв таблицу массива объектов. по хорошему, массив это колонка у таблицы.
По умолчанию старайтесь именно так маппить.
Но вы можете объявить User тип колонки и фигачить внутрь блоб данные или всё что угодно.
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632606
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632685
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123по хорошему, массив это колонка у таблицы.
По умолчанию старайтесь именно так маппить.
Но как это сделать в приведенном мною примере? Если через аннотации.
В "Java Persistence with Hibernate" ничего подобного нет, только через коллекции.
Через реализацию UserType, понятное дело, можно. Но пока для меня сложно.

БД для отображения может не иметь поддержки типа "массив" (пока юзаю MS SQL 2017).

Если стандартными средствами Hibernate нельзя, пока реализую через промежуточную коллекцию, с инициализацией массива из оной и обновлением ея содержимого перед вызовом persist(). Всё равно необходима инициализация сетевого движка MODBUS перед непосредственно взаимодействием с клиентом.

Впрочем, сначала даже буду работать непосредственно с коллекцией. Предполагаю юзать или ArrayList или что-то из map-ов (важна не только скорость поиска регистра по конкретному адресу, но и скорость доступа к последовательности адресов).
Но в боевом режиме будет работа с парой сотен объектов Device, к каждому запрос раз в секунду.
Если быстродействия не будет хватать, тогда использую массивы.
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632693
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отделите быстрый объект Device, который висит в памяти и что-то делает от медленного DeviceEntity который маппится на базу.
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632695
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frame Relay....
Впрочем, сначала даже буду работать непосредственно с коллекцией. Предполагаю юзать или ArrayList или что-то из map-ов (важна не только скорость поиска регистра по конкретному адресу, но и скорость доступа к последовательности адресов).
Но в боевом режиме будет работа с парой сотен объектов Device, к каждому запрос раз в секунду.
Если быстродействия не будет хватать, тогда использую массивы.

ArrayList и есть реализация коллекции на основе массива. Т.ч. в чем может быть проблема со скоростью - не понятно

если бы у Вас в массиве были атомарные типы (int,double...etc), то тогда стандартные коллекции давали бы жуткий over head мз-за необходимости boxing, unboxing (но и это решается выбором правильных коллекций). Но у Вас объекты. Т.ч. откуда взятся измеримой разнице межде ArrayList и чистым array - лично мне совершенно не понятно.
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632716
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Если хибер JPA умеют работать с ArrayList, то я не понимаю почему бы им не уметь работать точно так же и с массивами. В инете есть примеры маппинга для хибернейта. Но JPA, подозреваю, массивы не умеет.
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632717
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frame RelayНо как это сделать в приведенном мною примере? Если через аннотации.
В "Java Persistence with Hibernate" ничего подобного нет, только через коллекции.
Через реализацию UserType, понятное дело, можно. Но пока для меня сложно.
я же сказал - пытаетесь сделать стандартно(коллекции) и потом показываете почему нельзя.
Рисуете UML схему классов.

Frame RelayБД для отображения может не иметь поддержки типа "массив" (пока юзаю MS SQL 2017).
и оракл умеет массив загнать в одно поле, но я бы так не делал. Не универсально. Уж лучше User types BLOB
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632729
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123....и оракл умеет массив загнать в одно поле, но я бы так не делал. Не универсально. Уж лучше User types BLOB
ссылку на доку плиз

Насколько я понимаю, VARRAY сохраненные "якобы" в поле на самом деле разворачиваются во вложенные таблицы. Ну или мы говорим о разном. В общем, нужна ссылка на доку, что Вы подразумеваете под "массив загнать в одно поле"
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632747
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНасколько я понимаю, VARRAY сохраненные "якобы" в поле на самом деле разворачиваются во вложенные таблицы. Ну или мы говорим о разном. В общем, нужна ссылка на доку, что Вы подразумеваете под "массив загнать в одно поле"
Код: java
1.
2.
3.
4.
CREATE TYPE XX_TYPE_ORDERS IS VARRAY(5) OF VARCHAR2(100);
CREATE TABLE XX_ORDERS (ORDER_ID NUMBER,ORDER_NAME XX_TYPE_ORDERS);
INSERT INTO XX_ORDERS VALUES (1, XX_TYPE_ORDERS('Order 1','Order 2','Order 3'));
INSERT INTO XX_ORDERS VALUES (2, XX_TYPE_ORDERS('Order 21','Order 22','Order 23'));
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632756
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, был не прав. Попутал varray и nested table (((
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632818
Ilya007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frame Relay Но стандартные коллекции с интерфейсом RandomAccess здесь не подходят по скорости работы. Индекс в массиве является адресом регистра, который приходит в сетевом пакете (протокол MODBUS).

А почему не использовать mongoDB?
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632873
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frame RelayСохранение состояния прибора в базе и восстановление из базы разве не относятся к категории CRUD?
Там ещё может быть сохранение диапазона регистров (область уставок прибора) для имитации ЭНЗУ. Причём довольно частые.
А работу с регистрами (читать-писать) и с сетью по промышленному протоколу можно считать бизнес-логикой (собственно полезной работой).

Просто стандартные примеры (всякие магазины-аукционы-etc) скучны и банальны, да и разработка эмулятора для собственных нужд позволяет сочетать приятное с полезным.

Но меня интересует именно вопрос отображения в таблицу массива объектов. Возможно ли такое вообще или только через промежуточную коллекцию? Мало ли что потом могут спросить на собеседовании.
вариантов три - один ко многим, ембеддабл коллекшн (что почти тоже самое) и джейсонби с сериализатором в жейсон и обратно. выбирай какой нравится.
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39632874
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczLeonid Kudryavtsev,

Если хибер JPA умеют работать с ArrayList, то я не понимаю почему бы им не уметь работать точно так же и с массивами. В инете есть примеры маппинга для хибернейта. Но JPA, подозреваю, массивы не умеет.

кастом атрибьютс )) правда, работа через жпкл с ним имхо, невозможна. ну или я не нашел. а вот со спецификациями, и вызовом втроенных постгрес функций (если речь о нем) - то вполне себе комфортно. в рамках разумного конечно же. я так понимаю, автора особо не парит отсутствие реляции в таком случае.
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39633005
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за помощь.

Первоначально буду использовать ArrayList (т.е. стандартны способ). Но если быстродействия всё-таки не хватит (пара сотен Device и даже более), то буду пробовать другие варианты, приведенные ниже (сначала UserType).
...
Рейтинг: 0 / 0
Как в Hibernate отобразить array объектов?
    #39633092
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пара сотен это пшик.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как в Hibernate отобразить array объектов?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]