Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / как перевести программу на JPA с минимальными усилиями / 25 сообщений из 54, страница 1 из 3
26.05.2012, 22:08:13
    #37813146
badboychik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
История такая - есть прога которую писали тупые студенты, щас хочу немного переписать.

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

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

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

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

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

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



И написать обработку аннотации для генерации формы или просто для связывания компонентов.
...
Рейтинг: 0 / 0
27.05.2012, 10:19:48
    #37813261
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
badboychikВ целом мне надо сделать типичное окно-навигатор с кнопками "вперед", "назад", "новая" по записям таблицы
В яве даже такой примитив выливается в шаманство, охренеть просто.
Если есть готовые примеры или наводки где искать, буду благодарен.
чтобы не шаманить для таблиц есть 3 варинта ZK \ SmartGWT \ Vaadin ну и ещё всякие Клик и т.д.
...
Рейтинг: 0 / 0
27.05.2012, 11:51:43
    #37813281
badboychik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
Petro123ZK \ SmartGWT \ Vaadinу меня не веб, а десктоп. на свинге надо
...
Рейтинг: 0 / 0
27.05.2012, 14:13:59
    #37813345
badboychik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
Приходится сейчас делать так:
В конструкторе формы:
Код: 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
27.05.2012, 16:24:35
    #37813435
GregTk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
badboychik,

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

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

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

. А как в конфигурации JPA это указать?
- в настройках JDBC-пула, в соответствии со спецификой используемого JDBC-драйвера
...
Рейтинг: 0 / 0
27.05.2012, 20:31:09
    #37813578
badboychik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
так это и есть команда для JDBC, а в JPA как? Где там JDBC пул? Там в persistence.xml все прописывается и все. Пытался там в проперти добавить "encoding" - нет эффекта
...
Рейтинг: 0 / 0
28.05.2012, 10:27:25
    #37814033
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
badboychikтак это и есть команда для JDBC, а в JPA как? Где там JDBC пул? Там в persistence.xml все прописывается и все. Пытался там в проперти добавить "encoding" - нет эффекта
- в persistence.xml описываются либо настройки для JDBC-драйвера, либо указывается имя внешнего JDBC-пула. Начнем с простых вопросов:
1) Вы используете JDBC-пул или непосредственное подключение к БД? Судя по вопросу:
badboychikЧто это за коннект и логин, он отдельно от ранее созданного соединения будет постоянно коннектиться что ли?? Или можно ему передать соединение? делаю телепатический вывод, что пул не используется (отсюда и проблемы с производительностью)
2) Какая БД и соответственно JDBC-драйвер используется? (для разных БД настройки разные)
3) Чтобы не играть в вопросы-ответы приведите свой persistence.xml
...
Рейтинг: 0 / 0
28.05.2012, 17:46:06
    #37814937
badboychik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
БД фаербёрд, драйвер 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
29.05.2012, 09:31:14
    #37815703
AlexJm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
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
29.05.2012, 10:13:47
    #37815762
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
- что-то вроде:
Код: xml
1.
2.
     
<property name="javax.persistence.jdbc.url" value="jdbc:firebirdsql://localhost:3050/i:/CalcRD/5.gdb?charSet=Cp1251" /> 


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

В итоге - если использовать JDBC это надо для каждой таблицы
1) создать класс
2) создать в нем как минимум методы getAll, findById,update,delete
3) и в них все запросы ручками собирать из полей
4) прописать вручную jgoodies-биндинг контролов к полям классов
так что ли?
...
Рейтинг: 0 / 0
30.05.2012, 10:41:53
    #37817564
AlexJm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
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
30.05.2012, 11:56:27
    #37817685
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
badboychikПлохо.. если при открытии каждой формы будет создаваться соединение, это будет постоянно задержка открытия формы.
ты пробовал? Не будет никакой задержки.
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
30.05.2012, 11:59:33
    #37817695
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как перевести программу на JPA с минимальными усилиями
badboychik,

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

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

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

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

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


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