Форум на Kuban.ru (http://forums.kuban.ru/)
-   Разработка программ (http://forums.kuban.ru/f1024/)
-   -   Spring data: я что-то не понимаю, или он ужасен? (http://forums.kuban.ru/f1024/spring_data_ya_chto-_ne_ponimayu_ili_uzhasen-8291463.html)

Добрых дел мастер 21.04.2017 18:16

Spring data: я что-то не понимаю, или он ужасен?
 
Развлекаюсь со spring data.
В частности, мне нужно сохранить в mongodb объект, который содержит в себе изображение в формате BufferedImage. Но он этого не может сделать потому, что:
org.springframework.data.mapping.model.MappingException: Ambiguous field mapping detected! Both private int sun.awt.image.ByteComponentRaster.maxX and private int sun.awt.image.ByteInterleavedRaster.maxX map to the same field name maxX! Disambiguate using @Field annotation!

Вроде, очевидно. Пометьте спорные моменты словом @Field - и все, конфликт разрешен. Но как я это сделаю внутри класса, который писал не я?

Окей, может есть альтернативный способ? Можно же написать геттер, который приведет содержимое этой картинки в какой угодно вид. Но нет - спринг дата работает только с полями. Рефлекшн, мать его.

Кстати, в тему рефлекшна. Мне кажется, что это - грязный хак и кроме как для тестирования и отладки его использовать не следует. Плюс, везде пишут, что это медленно. А тут он и в хвост и в гриву.

Самое противное, мне это не очень нужно. Картинки должны храниться в другом хранилище, монго - исключительно для универсальности и поддержки старого кода.

В качестве решения пока-что вижу создание класса-обертки, который перед сохранением вынет данные. Может, есть решение получше?

Добрых дел мастер 21.04.2017 18:19

кстати, в hibernate можно использовать геттеры. Почему в спринг дате не так?

wayerr 22.04.2017 18:17

BufferedImage - представление битмапа в памяти, хранить надо конкретный формат, который очевидно представлен в виде массива байт

Добрых дел мастер 22.04.2017 22:40

почему конкретный формат? Банально - серилизовать класс. Если мне все равно, в каком формате хранить (главное, чтобы восстановился в таком же)?

wayerr 24.04.2017 01:38

>Банально - серилизовать класс.

1) это не банально,

2) сериализовать в java , это также преобразовать в поток байт, и то если объект реализует интерфейс Serializable

3) преобразовывать класс изображения в байты - занятие, по меньшей мере странное, т.к. она займет в памяти W*H*3 байт (для 8битного RGB) это например 6 мегабайт для скриншота (1920*1080*3), 1000 таких картинок - оппа и у тебя гигабайтная табличка субд. В то время как в png скриншот сего форума занимает например 200кб, что в 30 раз меньше

Добрых дел мастер 24.04.2017 06:53

ок, тогда как мне сохранить класс, содержащий BufferedImage? В случае с hibernate я просто создал бы геттер, который, например, генерит ту же png и повесил бы на него аннотацию @Column?

wayerr 24.04.2017 12:40

> В случае с hibernate я просто создал бы геттер, который, например, генерит ту же png и повесил бы на него аннотацию @Column?

[url]http://docs.spring.io/spring-data/data-mongo/docs/1.4.2.RELEASE/reference/html/mapping-chapter.html[/url]

>6.3.6 Overriding Mapping with explicit Converters

?

x0577216 25.04.2017 06:53

[quote=Добрых дел мастер;44120481]занятие, по меньшей мере странное, т.к. она займет в памяти W*H*3 байт (для 8битного RGB) это например 6 мегабайт для скриншота[/quote]
давным давно мудрые дяди разработали сжатие картинок. вот пример с классическим изображением Lena
263 222 lena512.bmp
16 301 lena512.JPG
11 576 lena51220.JPG
на глаз не отличишь.

Добрых дел мастер 25.04.2017 10:33

2wayerr. Читал я про конвертеры, мне не понравилось, что описание по сути таблицы в БД находится в двух разных местах.
2x0577216. А как насчет потерь при сжатии? Формат BufferedImage не просто так придуман. Он подразумевает работу с изображением.
Хотя, есть форматы со сжатием без потерь.

wayerr 25.04.2017 16:21

8-Добрых дел мастер > что описание по сути таблицы в БД находится в двух разных местах.

какое отношение "конвертер объекта класса в байты" имеет к "таблиц бд"?

x0577216 26.04.2017 14:08

[quote=Добрых дел мастер;44126950]А как насчет потерь при сжатии? [/quote]
1 Никак. Эта Лена 256*256 используется как образец при проверке всяческих методов обработки. При сжатии до 30% и 20% человеческий глаз их не различает.
2 Общеизвестные СУБД имеют поля данных типа BLOB =
Википедия: В СУБД BLOB — специальный тип данных, предназначенный, в первую очередь, [u]для хранения изображений[/u], а также компилированного программного кода.

max 29.04.2017 20:31

10-x0577216 > Брехня! Переменные не могут быть в куче, а объекты на стеке. Это я про мнение автора в другой теме. :)


Текущее время: 19:22. Часовой пояс GMT +3.