powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / как перевести программу на JPA с минимальными усилиями
25 сообщений из 54, страница 1 из 3
как перевести программу на JPA с минимальными усилиями
    #37813146
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
История такая - есть прога которую писали тупые студенты, щас хочу немного переписать.

Работа с БД там такая - в 5 классах при старте создавались свои подключения к БД, причем настройки соединения дублировались во всех 5, потом в каждом классе делался запрос к БД и помещал все данные в ОДИН глобальный объект "контекст".
А все формы обращаются к этому объекту и читают из него, т.е. там все поля всех таблиц разделены только комментариями. Запись в базу не реализована пока вообще.

Я хочу перевести работу на JPA , чтобы не писать километровые куски JDBC-кода и обновлять из рекордсета элементы форм вручную. Хочу чтоб были биндинги для контролов, хочу сохранение и чтение всех полей одной строкой.

Пока удалось перевести одну форму на JPA - создал класс сущности, при открытии обращаюсь и получаю данные в List<>. Читает нормально но в полсекунды задержка и в лог пишется это:
автор
Код: plaintext
1.
[EL Info]: 2012-05-27 01:40:38.529--ServerSession(19955448)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504
[EL Info]: 2012-05-27 01:40:38.966--ServerSession(19955448)--file:*путь к проекту*/JavaApplication1/build/classes/_MyPU login successful
Что это за коннект и логин, он отдельно от ранее созданного соединения будет постоянно коннектиться что ли?? Или можно ему передать соединение?

Само соединение с базой я переделал и вывел в отдельный класс-синглтон. Пока получаю данные так:
Код: java
1.
2.
3.
emf = Persistence.createEntityManagerFactory("MyPU");
em = emf.createEntityManager();
data = em.createNamedQuery("OperObrabotki.findAll").getResultList();



Второй вопрос - как теперь повесить биндинг к элементу полученных данных? В уроках нетбинса все мастером делают, у меня нет в меню этого объекта куда я получаю данные.

И третье - надо ли углубляться в ТопЛинк/Хибер , или можно как то попроще сделать? Мне не надо всякие межтабличные связи, кучу аннотаций...

Пока гуглю на каждый мелкий вопрос, вроде понемногу получается )
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813186
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychik,
у тебя нет практически ничего из стека БД ---> ГУИ.
Вот и начинай с низу - Модель данных или Структура БД и маппинг классов на неё.
Предметная область \ выделение сущностей ЗНАЧИМЫХ для бизнеса.
ЗЫ. Как ты без связей обойдёшься - под вопросом.
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813204
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нее, есть модель с маппингом. Я уже сделал класс-сущность для одной таблицы (для теста на ней), добавил на форму бин указывающий на эту сущность.

Сейчас вопрос вот в чем - я указал привязку текстового поля к одному полю этого бина, получаю данные в него, а на форме данные не появляются.
Если без привязки делать тупо txtField.setText(dataitem.getField()); тогда данные видно
Так как полей около 20, как то нерационально писать руками если есть механизм привязок
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813208
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В целом мне надо сделать типичное окно-навигатор с кнопками "вперед", "назад", "новая" по записям таблицы

В яве даже такой примитив выливается в шаманство, охренеть просто.
Если есть готовые примеры или наводки где искать, буду благодарен.
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813243
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychik,

А если добавить в модель описание UI полей и генерить форму, не быстрее получится? Там кода не много нужно, а профит ощутимый.

что-то типа такого замутить:

Код: java
1.
2.
@UiLabel("Телефон")
private String phone;



И написать обработку аннотации для генерации формы или просто для связывания компонентов.
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813261
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychikВ целом мне надо сделать типичное окно-навигатор с кнопками "вперед", "назад", "новая" по записям таблицы
В яве даже такой примитив выливается в шаманство, охренеть просто.
Если есть готовые примеры или наводки где искать, буду благодарен.
чтобы не шаманить для таблиц есть 3 варинта ZK \ SmartGWT \ Vaadin ну и ещё всякие Клик и т.д.
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813281
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ZK \ SmartGWT \ Vaadinу меня не веб, а десктоп. на свинге надо
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813345
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приходится сейчас делать так:
В конструкторе формы:
Код: java
1.
2.
3.
4.
         emf = DBConnection.getEMF(); //фабрика создается при старте приложения в модуле DBConnection, тут только получаем
         em = emf.createEntityManager(); // создаем из фабрики менеджер
         data = em.createNamedQuery("OperObrabotki.findAll").getResultList(); // делаем запрос и получаем все строки 
         LoadDataToUI(0);// загружаем в контролы первую запись

процедура LoadDataToUI(int i) помещает во все контролы значения из объекта под номером i в списке всех строк-объектов
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private void LoadDataToUI(int i) {
      if (!data.isEmpty()) {
         operObrabotki1 = data.get(i);
         //txtMetodVrez.setText(dataitem.getMetodVresaniya());
      }
      else return;
      txtNumPP.setValue(operObrabotki1.getNomExp()); // в свойство текстового поля суем поле объекта
      txtTypeEE.setValue(operObrabotki1.getIdElement());
      txtCodeOperation.setValue(operObrabotki1.getIdOper());
      txtMetodVrez.setValue(operObrabotki1.getMetodVresaniya());
      txtTypePogr.setValue(operObrabotki1.getTypePogruzheniya());
      // ... еще 15 полей... !!!!
}


Затем надо будет сделать процедуру LoadDataFromUI , там сделать все наоборот. Мне одному кажется что это тупо?
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813435
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychik,

JGoodies Binding глянь, там без аннотаций, но само связывание хорошее.
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813482
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
черт, теперь проблема с JPA - русские символы не показываются. Если просто через JDBC соединяться то там можно указать
Код: java
1.
dataSource.setCharSet("cp1251");

. А как в конфигурации JPA это указать?
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813490
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кажтся перевод на JPA слишком монструозное предприятие, надо изучать матчасть и книги читать.
Примеры биндинга на сайте нетбинса есть только для таблиц, для отдельных полей показан только биндинг к активной строке таблицы.

Добавил в класс сущности метод getAll и через JDBC заполняю спиоск объектов, потом добавлю методы Update(id) и Delete(id). Лучше тупо но 100% работает чем неделю городить монстра JPA
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813521
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychikчерт, теперь проблема с JPA - русские символы не показываются. Если просто через JDBC соединяться то там можно указать
Код: java
1.
dataSource.setCharSet("cp1251");

. А как в конфигурации JPA это указать?
- в настройках JDBC-пула, в соответствии со спецификой используемого JDBC-драйвера
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37813578
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так это и есть команда для JDBC, а в JPA как? Где там JDBC пул? Там в persistence.xml все прописывается и все. Пытался там в проперти добавить "encoding" - нет эффекта
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37814033
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychikтак это и есть команда для JDBC, а в JPA как? Где там JDBC пул? Там в persistence.xml все прописывается и все. Пытался там в проперти добавить "encoding" - нет эффекта
- в persistence.xml описываются либо настройки для JDBC-драйвера, либо указывается имя внешнего JDBC-пула. Начнем с простых вопросов:
1) Вы используете JDBC-пул или непосредственное подключение к БД? Судя по вопросу:
badboychikЧто это за коннект и логин, он отдельно от ранее созданного соединения будет постоянно коннектиться что ли?? Или можно ему передать соединение? делаю телепатический вывод, что пул не используется (отсюда и проблемы с производительностью)
2) Какая БД и соответственно JDBC-драйвер используется? (для разных БД настройки разные)
3) Чтобы не играть в вопросы-ответы приведите свой persistence.xml
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37814937
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БД фаербёрд, драйвер Jaybird
файл как в примерах
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="UTF-8" ?> 
- <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
- <persistence-unit name="MyPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>database.OperObrabotki</class> 
    <class>database.Instrument</class> 
-   <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:firebirdsql://localhost:3050/i:/CalcRD/5.gdb" /> 
      <property name="javax.persistence.jdbc.password" value="masterkey" /> 
      <property name="javax.persistence.jdbc.driver" value="org.firebirdsql.jdbc.FBDriver" /> 
      <property name="javax.persistence.jdbc.user" value="SYSDBA" /> 
      <property name="encoding" value="Cp1251" /> 
    </properties>
  </persistence-unit>
</persistence>
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37815703
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychikЯ хочу перевести работу на JPA , чтобы не писать километровые куски JDBC-кода и обновлять из рекордсета элементы форм вручную.

Не думаю, что имеет смысл затевать шаманство с JPA. Хотя для общего развития полезно.

badboychikХочу чтоб были биндинги для контролов, хочу сохранение и чтение всех полей одной строкой.

JGoodies Bindging. Это единственный биндинг для свинга (если речь про десктоп, конечно).

badboychikЧто это за коннект и логин, он отдельно от ранее созданного соединения будет постоянно коннектиться что ли?? Или можно ему передать соединение?

Нет, EclipseLink будет сам создавать соединения, когда ему нужно. Обычно, как минимум два - на чтение и на запись.

badboychikСамо соединение с базой я переделал и вывел в отдельный класс-синглтон. Пока получаю данные так:
Код: java
1.
2.
3.
emf = Persistence.createEntityManagerFactory("MyPU");
em = emf.createEntityManager();
data = em.createNamedQuery("OperObrabotki.findAll").getResultList();



Это не соединение с базой. Это синглетон работы с JPA EMF. Как правило, каждый EntityManager создает свое соединение с базой.

badboychikВторой вопрос - как теперь повесить биндинг к элементу полученных данных? В уроках нетбинса все мастером делают, у меня нет в меню этого объекта куда я получаю данные.

NetBeans использует Beans Binding, который помер и вряд ли воскреснет.

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

для JGoodies Bindings:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
final List<Data> data = em.createNamedQuery("OperObrabotki.findAll").getResultList();
final SelectionInList<Data> list  = new SelectionInList<Data>(data);
final BeanAdapter<Data>	 adapter = new BeanAdapter<Data>(list, true);
final JTextField edit1	= new JTextField();
Bindings.bind(edit1, adapter.getValueModel(adapter, "dataProperty"), true);
AbstractAction actionFirst = new AbstractAction() {
	@Override
	public void actionPerformed(ActionEvent e)
	{
		if (list.getSize() > 0)
			list.setSelectionIndex(0);
	}
}
JButton buttonFirst = new JButton(actionFirst);


вроде как для начала не очень сложно :)
Проблемы начинаются с выводом форматированных данных (даты, числа с точкой etc). Но это уже совсем другая история.
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37815762
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- что-то вроде:
Код: xml
1.
2.
     
<property name="javax.persistence.jdbc.url" value="jdbc:firebirdsql://localhost:3050/i:/CalcRD/5.gdb?charSet=Cp1251" /> 


хотя насчет CP1251 я бы подумал, возможно есть какая-то путаница с кодировками, но тут Вам видней в какой кодировке у Вас что
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37817354
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexJmЭто не соединение с базой. Это синглетон работы с JPA EMF
Не, синглтон используется для простого JDBC, сейчас через него работаю, JPA убрал
AlexJmНет, EclipseLink будет сам создавать соединения, когда ему нужно.
Плохо.. если при открытии каждой формы будет создаваться соединение, это будет постоянно задержка открытия формы. Должен быть какой то пул... Я слышал в курсах что EntityManager это легкий объект, можно создавать сколько угодно, а вот EntityManagerFactory лучше при старте один раз создать, он тяжелый.
автор.....?charSet=Cp1251так выдает ошибку при соединении, это способ для MySQL подходит

В итоге - если использовать JDBC это надо для каждой таблицы
1) создать класс
2) создать в нем как минимум методы getAll, findById,update,delete
3) и в них все запросы ручками собирать из полей
4) прописать вручную jgoodies-биндинг контролов к полям классов
так что ли?
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37817564
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychikAlexJmНет, EclipseLink будет сам создавать соединения, когда ему нужно.
Плохо.. если при открытии каждой формы будет создаваться соединение, это будет постоянно задержка открытия формы. Должен быть какой то пул... Я слышал в курсах что EntityManager это легкий объект, можно создавать сколько угодно, а вот EntityManagerFactory лучше при старте один раз создать, он тяжелый.

Я баловался вот с таким:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
HashMap<String, String> result = new HashMap<String, String>();
...
result.put("eclipselink.jdbc.connections.initial", "1");
result.put("eclipselink.jdbc.connections.min", "1");
result.put("eclipselink.jdbc.connections.max", "1");
result.put("eclipselink.jdbc.read-connections.min", "1");
result.put("eclipselink.jdbc.read-connections.max", "1");
result.put("eclipselink.jdbc.write-connections.min", "1");
result.put("eclipselink.jdbc.write-connections.max", "1");
result.put("eclipselink.jdbc.connection_pool.read.shared", "true");
result.put("eclipselink.jdbc.read-connections.shared", "true");
EntityManagerFactory emf = Persistence.createEntityManagerFactory("application", result);		



badboychikВ итоге - если использовать JDBC это надо для каждой таблицы
1) создать класс
2) создать в нем как минимум методы getAll, findById,update,delete
3) и в них все запросы ручками собирать из полей
4) прописать вручную jgoodies-биндинг контролов к полям классов
так что ли?

видимо да.
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37817685
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychikПлохо.. если при открытии каждой формы будет создаваться соединение, это будет постоянно задержка открытия формы.
ты пробовал? Не будет никакой задержки.
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37817695
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychik,

MS рекомендует открывать соединение на каждое окно-форму.
Но это не для Java-стереотипов и архитектуры.
ЗЫ.
Пиши, как тебе удобнее и ПОД проект.
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37817781
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123badboychikПлохо.. если при открытии каждой формы будет создаваться соединение, это будет постоянно задержка открытия формы.
ты пробовал? Не будет никакой задержки.

смотря с чем соединяться. С Firebird - да, задержки быть не должно, с Oracle - выглядит смешно, особенно на lookup-формах.

Petro123badboychik,
MS рекомендует открывать соединение на каждое окно-форму.
Но это не для Java-стереотипов и архитектуры.

ну да. И в persistent-layer хранить все объекты по нескольку раз (кто мешает открыть одну и ту же форму дважды)? Да и Refresh без auto-commit будет прикольно смотреться.
Но самое веселое, что в случае с Eclipse/TopLink JPA эта рекомендация становится единственно возможным способом общения с данными. Каждая форма - свой EntityManager. А еще лучше - каждый запрос. Я как это (и замечательную работу ScrollableCursor) увидел, так и забил на сей продукт.
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37817827
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123badboychikПлохо.. если при открытии каждой формы будет создаваться соединение, это будет постоянно задержка открытия формы.
ты пробовал? Не будет никакой задержки.
пробовал, есть задержка. Видно по консоли нетбинса как EclipseLink открывает соединение, ради 10 строк для заполнения комбобокса происходит задержка 0.5-1 секунда
AlexJmвидимо да.ппц
А ктонибудь использовал ORM "Ebean" ? пишут что легкий и удобный. Язык запросов на дотнетовский LINQ похож 1в1
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37817857
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
badboychikпробовал, есть задержка. Видно по консоли нетбинса как EclipseLink открывает соединение, ради 10 строк для заполнения комбобокса происходит задержка 0.5-1 секунда
AlexJm
ты перепутал соединенние на форму-окно-view и на контрол?
...
Рейтинг: 0 / 0
как перевести программу на JPA с минимальными усилиями
    #37817864
Фотография badboychik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще склоняюсь к использованию nosql баз. Никаких запросов и ORM, вызвал SAVE() и все.

вот читаю http://www.garret.ru/eoodbms.html#compare
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / как перевести программу на JPA с минимальными усилиями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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