
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
17.04.2013, 00:15:37
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
Здравствуйте! Пишу приложение для работы с MySQL БД. Пишу на Java, использую Hibernate. Возникла проблема: рассматривается фрагмент БД MySQL: имеются таблицы Adress, Firma, Supplier. Не спрашивайте, почему так: партия сказала надо... Атрибуты таблицы Adress: int ID, varchar City, varchar Street, int NumOfHouse. Атрибуты Firma: int Firma_ID, String Name, String Phone, int Adr_ID (это внешний ключ, связь с таблицей Adress). Атрибуты Supplier: int Post_ID, int Firm_ID (внешний ключ, связь с Firma), double Quality, double Price_Qual. Все связи типа один к одному. Сей фрагмент должен отображаться в приложении так: чтобы в моем приложении создавалось окошко, где будет табличка Suppliers, где будут столбцы Name, Phone, City, Street, NoH, Qual, Price_Qual, то есть, список записей, аналогичный SQL-запросу: Код: sql 1. У меня есть классы Supplier, Firm, FirmMetods, Adress, AdressMetods, и к классу Supplier есть SupplierMetods, SupplierTableModel, SupplierFrame. Привожу только 3 класса: классы FirmMetods, AdressMetods аналогичны SupplierMetods. package tovar.entity; import java.util.HashSet; import java.util.Set; public class Supplier { private Long PostID; private Firm Sfirm; private int Sfirmtype; private double SQual; private double SPrice_Qual; private Set<Tovar> tovarList = new HashSet<Tovar>(); public Long getPostID() { return PostID; } public void setPostID(Long postID) { PostID = postID; } public Firm getSfirm() { return Sfirm; } public void setSfirm(Firm sfirm) { Sfirm = sfirm; } public int getSfirmtype() { return Sfirmtype; } public void setSfirmtype(int sfirmtype) { Sfirmtype = sfirmtype; } public double getSQual() { return SQual; } public void setSQual(double sQual) { SQual = sQual; } public double getSPrice_Qual() { return SPrice_Qual; } public void setSPrice_Qual(double sPrice_Qual) { SPrice_Qual = sPrice_Qual; } public Set<Tovar> getTovarList() { return tovarList; } public void setTovarList(Set<Tovar> tovarList) { this.tovarList = tovarList; } } package tovar.entity; import java.util.List; import org.hibernate.Session; import shop.utils.HibernateUtil; public class SupplierMetods { public void addSupplier(Adress adress, Firm firm, int firmtype, double qual, double pqual) { //добавление нового товара Session session = HibernateUtil.configureSessionFactory().getCurrentSession(); session.beginTransaction(); Supplier r= new Supplier(); r.setSfirm(firm); r.setSfirmtype(firmtype); r.setSQual(qual); r.setSPrice_Qual(pqual); session.save(r); session.getTransaction().commit(); } public void updateSupplier(Object o) { Session session = HibernateUtil.configureSessionFactory().getCurrentSession(); session.beginTransaction(); session.update(o); System.out.println("Updated"); session.flush(); session.getTransaction().commit(); } public List<Supplier> listSupplier() { Session session = HibernateUtil.configureSessionFactory().getCurrentSession(); session.beginTransaction(); List<Supplier> result = session.createQuery(" select Firma.Name, Firma.Phone, Adress.City, Adress.Street, " + "Adress.NumOfHouse, Supplier.Quality, Supplier.Price_Qual from Supplier s, Firm f, Adress a " + "where (s.Firms_ID = f.Firma_ID) AND (f.Adr_ID = a.Adress_ID)").list(); session.getTransaction().commit(); return result; } } package tovar.entity; import java.util.List; import javax.swing.table.AbstractTableModel; public class supplierTableModel extends AbstractTableModel{ private String[] columnsNames = {"Name","Phone","City", "Street", "NumOfHouse", "Quality", "Price_Quality"}; private List<Supplier> data; public supplierTableModel(List<Supplier> suppList) { super(); data = suppList; } @Override public int getRowCount() { // TODO Auto-generated method stub synchronized (data) { return data.size(); } } @Override public int getColumnCount() { // TODO Auto-generated method stub return 7; } @Override public String getColumnName(int column) { return columnsNames[column];} @Override public Object getValueAt(int row, int col){ switch(col){ case 0: return data.get(row).getSfirm().getFName(); case 1: return data.get(row).getSfirm().getFPhone(); case 2: return data.get(row).getSfirm().getAdress().getAdrCity(); case 3: return data.get(row).getSfirm().getAdress().getAdrStreet(); case 4: return data.get(row).getSfirm().getAdress().getAdrNoH(); case 5: return data.get(row).getSQual(); case 6: return data.get(row).getSPrice_Qual(); default: return data.get(row).getPostID(); } } @Override public void setValueAt(Object value, int row, int col){ Supplier r = data.get(row); SupplierMetods t = new SupplierMetods(); switch(col){ case 0: r.getSfirm().setFName(value.toString()); t.updateSupplier(r); fireTableCellUpdated(row,col); break; case 1: r.getSfirm().setFPhone(value.toString()); t.updateSupplier(r); fireTableCellUpdated(row,col); break; case 2: r.getSfirm().getAdress().setAdrCity(value.toString()); t.updateSupplier(r); fireTableCellUpdated(row,col); break; case 3: r.getSfirm().getAdress().setAdrStreet(value.toString()); t.updateSupplier(r); fireTableCellUpdated(row,col); break; case 4: r.getSfirm().getAdress().setAdrNoH(Integer.parseInt(value.toString())); t.updateSupplier(r); fireTableCellUpdated(row,col); break; case 5: r.setSQual(Double.parseDouble(value.toString())); t.updateSupplier(r); fireTableCellUpdated(row,col); break; case 6: r.setSPrice_Qual(Double.parseDouble(value.toString())); t.updateSupplier(r); fireTableCellUpdated(row,col); break; } } } Еще на всякий случай приведу список полей классов Adress, Firm: private Long AdrID; private String AdrCity; private String AdrStreet; private int AdrNoH; //Number of house private Long FirmID; private String FName; private String FPhone; private Adress adress; Вот так. Аннатоциями не пользуюсь, задача в написании именно с маппинг-файлами. Плз, кто может, помогите, как мне сделать так, чтобы выборка делалась нормально, и таблица в приложении тоже заполнялась нормально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.04.2013, 10:56:56
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
"Догадайтесь какая возникла проблема" и "прочитайте мой код, который мне даже лень подсветить" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.04.2013, 22:03:38
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
Критика конструктивная, согласен. Виноват, исправлюсь: Код: 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. Класс SupplierMetods: Код: 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. 39. 40. 41. 42. 43. Класс SupplierTableModel: Код: 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. Вот так. Что хочу сказать: в классе SupplierMetods запрос работает корректно как в базе, так и в Java. Но возникает ошибка: Код: java 1. , и указывает на строку Код: java 1. в классе SupplierTableModel, и на много чего еще, но не мои классы. В чем ошибка, как ее преодолеть? Я так понимаю, проблема в том, что в классе Supplier нет таких полей, которые я хочу увидеть в результате выборки. Посоветуйте пожалуйста, как мне классы организовать, что все работало. Я подумал было сделать в классе Supplier поля FirmName, FirmPhone, City, Street, NumOfHouse в дополнение к существующим, и подогнать под результат запроса из базы, но тогда непонятно, за фигом нужны все связи и вообще Hibernate. Должен же быть другой путь, который я не могу найти. Кто может, посоветуйте плз, или дайте ссылку на литературу. Всем заранее спасибо. П.С. за свой предыдущий корявый пост очень изиняюсь, забыл про подсветку кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.04.2013, 22:10:33
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
Теперь понятно. Запрос в таком виде никак вам не вернет список Supplier. Он вам возвращает List<Object[]> на самом деле. Чтобы найти решение, достаточно открыть мануал http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html И прочитать пару разделов. Код: java 1. Но, вообще, мануал стоит освоить целиком. Запрос можно сделать намного проще, если ассоциации прописать в маппинге. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.04.2013, 01:04:20
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
Большое спасибо за ответ. Про то, что не возвращается список типа Supplier, я понял, но вот что сделать, пока не ясно. Я бы радостно подкорректировал списки, убрав типизацию, ну то есть чтобы было не List<Supplier> а просто List, но тогда непонятно, как мне выцепить поля связанных классов, типа названия фирмы и адреса... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.04.2013, 01:12:07
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
За ссылку большое спасибо, вполне познавательно. Возник вопрос: там сущности Cat и Dog. У сущности Cat есть атрибут Dog_ID. Вроде бы там сказано, что связаны отношением многие к одному. Вопрос в следующем: если у меня связь один к одному, то есть у одного Supplier один объект Firm, как мне делать связь? Делать так как я, то есть создавать в классе Supplier поле firm типа Firm, или делать поле Firm_ID типа int, то есть так, как сделано в MySQL базе? Сей вопрос меня давно уже интересует. Читал мануалы, оба варианта видел в примерах, но как сделать выборку из нескольких таблиц, не сказано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.04.2013, 21:41:54
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
В маппинге у меня прописаны связи: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Вот такие вот связи. О выборке: я создал новый класс Post с полями String Name, String Phone, String City, String Street, int num, double Qual, double PQual, то есть аналогичны результатам выборки. Изменил запрос: Код: java 1. 2. 3. Изменил класс SupplierTableModel: в конструктор передаю List<Post>. И получаю ту же самую ошибку: cannot be cast to tovar.entity.Post В чем тут проблема, вообще не понимаю... Вроде бы уже и результат запроса в класс попадает как положено, а туда же, толку никакого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.04.2013, 23:03:26
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
Валисий, Вы ничего не поменяли в запросе. Хиберней никак не может угадать что вы хотите List<Post>. Он вам возвращает List<Object[]>, потому что вы пишете SQL запросы, а не HQL и потому что вы не сообщаете какой объект хотите получить на выходе. Используйте HQL select from Post where... Используйте хотя бы Criteria API. Примеры обильно приведены в мануале. Почему вы продолжаете настойчиво использовать SQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.04.2013, 23:25:55
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
SQL использую потому что он взаимодействует непосредственно с базой, а не с классами Java, и честно говоря, в SQL ориентируюсь лучше, чем в HQL. Просто не понимаю, откуда HQL возьмет данные для выборки. За совет спасибо, буду пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
19.04.2013, 10:27:39
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
ВалисийПросто не понимаю, откуда HQL возьмет данные для выборки. а вы доку читали по хиберу полностью? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2013, 01:09:46
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
Доку по хиберу читал естественно не полностью. Использую Criteria. Имею следующее: Код: java 1. Выборка работает, но некорректно. Как я уже упоминал, у меня таблички связаны внешним ключрм. Результат выборки в SQL примерно такой: Код: sql 1. я подумал, что мне нужен inner join по столбцам Supplier.Firms_ID=Firma.Firma_ID, Firma.Adr_ID=Adress.Adress_ID. Как мне добиться такого эффекта? Пытался поставить sqlRestriction: Код: java 1. 2. Результатом выборки стала первая строкка таблицы Supplier, причем связанная с таблицей Firm неправильно. Как их правильно связать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2013, 03:45:37
|
|||
|---|---|---|---|
Hibernate + Swing |
|||
|
#18+
"Говорили, балакали, сіли та й заплакали ..." Да не надо их ручками связывать, ты уже по идее все в POJO связал, теперь просто выбирай требуемое. Так как не вижу твоих POJO, то затрудняюсь корректно отобразить, тем более, что нарушены общепринятые правила именования полей (индексное - id, все с маленькой буквы) ... не суть важно, но запутаться можно на раз-два. Если делать Код: java 1. то вернет Object[7] (как уже не раз выше было сказано). И хотя не очень понятно, зачем делать промежуточный объект с этим набором полей, когда они все EAGER, но тем не менее, если хочется получить на выходе все-таки List<Post>, то можно создать объект в HQL-запросе: Код: java 1. Естественно, в объекте Post необходимо создать конструктор с такими полями. Важнее, чтобы ты увидел, как связываются поля объектов в запросе (не поля таблиц! а поля объектов, так как HQL оперирует не таблицами, а сущностями). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2013, 23:11:20
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
Спасибо за ответы, особенно за ссылку, очень полезная, только очень уж длинные лекции... А все таки, можно ли такой запрос с помощью Criteria сделать? Я, как уже писал выше, сделал запрос, но он таблицы связывает совершенно не так, как надо мне. Вот как бы мне их связать? Или надо в маппинге прописать что то новое? Ну то есть: <one-to-one name="adress" class="tovar.entity.Adress"></one-to-one> В етом теге указать что нибудь типа key column, или как то так, чтобы хиберу было понятно, какой конкретно столбец есть внешний ключ и куда он ссылается. Или пойти другим путем: сделать в Criteria указание, как именно делать join и по каким столбцам. Пробовал написать HQL: session.createQuery("from Supplier").list(); Получил то же самое что и используя Criteria без ограничений, то есть выборку с left outer join по столбцам ID во всех таблицах, то есть таблицы Supplier, Firma были связаны как left outer join Firma on Supplier_ID = Firma_ID, что естественно меня не устраивает. Добавил Criteria с параметром JoinType, но толку чуть, потому как до сих пор не могу понять, где и как мне указать, по каким столбцам выполнять join. IDVsbruck , По поводу класса Post: я пришел к выводу, что он мне и не нужен вовсе, я его удалил. А по поводу SQL запроса: все бы хорошо, вот только он мне вернет опять таки именно List<Object> а мне нужен List<Supplier>, потому как в POJO и других классах у меня все методы исключительно для работы с объектами класса Supplier. По поводу отсутствия POJO: в первых постах я выложил классы. Я не уверен, но они вроде и есть POJO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2013, 23:13:25
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
Виноват, опять забыл подсветку кода: Код: xml 1. В етом теге указать что нибудь типа key column, или как то так, чтобы хиберу было понятно, какой конкретно столбец есть внешний ключ и куда он ссылается. Или пойти другим путем: сделать в Criteria указание, как именно делать join и по каким столбцам. Пробовал написать HQL: Код: java 1. Получил то же самое что и используя Criteria без ограничений, то есть выборку с left outer join по столбцам ID во всех таблицах, то есть таблицы Supplier, Firma были связаны как left outer join Firma on Supplier_ID = Firma_ID, что естественно меня не устраивает. Добавил Criteria с параметром JoinType, но толку чуть, потому как до сих пор не могу понять, где и как мне указать, по каким столбцам выполнять join. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.04.2013, 00:01:24
|
|||
|---|---|---|---|
|
|||
Hibernate + Swing |
|||
|
#18+
Товарищи, удивительное рядом... Я то, наивный, используя связь one to one наивно считал что все хорошо, все как в базе, ан нет: при использовании такой связи таблицы можно связать только по первичным ключам, то есть у связанных записей должны быть одинаковые ID. Но можно указать в теге one to one следующее: constrained="true". И не нужно забывать про lazy. Правда, я так не сделал, я сделал так: Код: xml 1. Sfirm есть поле класса Supplier, подразумевается фирма, которая является Supplier'ом. Firms_ID ето столбец в БД, внешний ключ таблицы Supplier, ссылающийся на таблицу Firm. unique - вот ето как раз и есть то, чего я добивался, то есть отношение один к одному. lazy - что ето такое, я так и не понял, но без него не работает, вываливается ошибка хибера: could not initialize proxy - no Session. И вышеописанный запрос делается так: Код: java 1. Смешно, однако... Дело было не в запросе а в маппинге, насколько я понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=59&mobile=1&tid=2129492]: |
0ms |
get settings: |
17ms |
get forum list: |
25ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
54ms |
get topic data: |
20ms |
get forum data: |
5ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 300ms |
| total: | 515ms |

| 0 / 0 |
