powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Hibernate и вынос бизнес-логики из СУБД
25 сообщений из 50, страница 1 из 2
Hibernate и вынос бизнес-логики из СУБД
    #39107517
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может ошибаюсь, но пошла (видимо уже давно) некая тенденция с выносом бизнес-логики из СУБД (пока правда не знаю куда именно выносят :), на сервера приложений или на клиент или и туда и туда).
Посмотрел
YouTube Video
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39107526
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
JDS,

"визуальное программирование - не нужно знать язык! связал компоненты и готово!"
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39107620
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Список достоинств верный.
Теперь список недостатков:

- требует очень много CPU и памяти.
- очень неэффективные запросы. Сложно настраивать Lazy/Eager initialization, нельзя использовать хинты.

Соответственно, при попытке снизить затраты ресурсов или ускорить работу начинаются жуткие пляски с бубном.

Ниша хибернейта - низконагруженные (до 10 параллельных юзеров) B2B системы (где юзеры переживут отклики в 200-500 миллисекунд) работающие со сложными бизнес-сущностями (от 20 таблиц), написанные низкоквалифицированными программистами.

Моё текущие представление о правильной B2B системе - это либо
1. Храним данные в нормализованном виде, пишем ХП для извлечения и сохранения этих данных. Вся бизнес-логика - в серверном приложении.
2. Храним данные в блобах/json. Никаких хранимок, сложный поиск, списки и пагинация делаются специализированным инструментарием типа Solr/ElasticSearch.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39107889
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS пошла (видимо уже давно) некая тенденция с выносом бизнес-логики из СУБД (пока правда не знаю куда именно выносят :), на сервера приложений или на клиент или и туда и туда).

Показалось. Или плохих программистов стало больше. Тогда не показалось.
JDSИли это делается, чтобы например разгрузить базу?

Чтобы не изучать SQL (делается программистами, которые подходят для вашей тенденции).
Имею ввиду применение Hibernate. Не надо разгружать базу, если нет признаков того, что она слишком загружена.
Но сервер приложений надо по возможности не загружать тем, что можно сделать в базе.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39107925
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В основе ORM-ов лежит методологическая ошибка: постулируется, что объекты программы отображаются на объекты схемы.
На самом деле DML-операторы манипулируют наборами, которые достаточно слабо связаны и со схемой и с данными, в ней хранящимися.
Но поскольку программисты очень сильно не хотят самостоятельно писать SQL-запросы, то придуман механизм сопоставления объектов и автоматической генерации SQL-кода, который достаточно хорош для CRUD-сценариев.
Реальных волшебных пузырьков у ORM-ов нет. Если бы они были, то нашлись бы умники, расширившие сферу применения автоматической кодогенерации для почти полного устранения программистов.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39108234
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторРаньше же вроде как наоборот стремились в базе делать то, что база может делать лучше всего, то есть обработка информации, SQL...


И сейчас то, что база делает лучше всего, стремяться делать в базе.

авторА теперь: "не нужно знать SQL" Неужели действительно все так радужно? )

Нет, не всё так радужно. Это автор доклада чуток приукрасил.
Кроме того, Hiber очень хорошо справляется только с CRUD операциями, а вот любую
аналитику, любые сложные запросы ему лучше не доверять.

авторНеужели теперь эффективнее ковыряться с данными, засовывая их в коллекции Java, а не обработка в СУБД с помощью SQL и хранимок, а базе на откуп отдают только самые простые селекты/инсерты/апдейты? )


Нет, не эффективнее.

авторИли это делается, чтобы например разгрузить базу?


Нет, не для этого
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39108289
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что в замен? Вот это? Оно даже компилятором не проверяется. Рантайм-бомба...
Код: vbnet
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.
        If (filterFR = "Unsubmitted") Then
            strFR = " AND FRP.Status='Saved' "
        ElseIf (filterFR = "Submitted") Then
            strFR = " AND FRP.Status='Submitted' "
        ElseIf (filterFR = "TS") Then
            strFR = " AND FRP.Status='TS' "
        ElseIf (filterFR = "NotPrinted") Then
            strFR = " AND WO.PrintStatus IN(0,1) "
        ElseIf (filterFR = "Printed") Then
            strFR = " AND WO.PrintStatus=2 "
        ElseIf (filterProject <> "") Then
            strFR = " AND Pr.WBS1 Like '" & filterProject & "%'"
        Else
            strFR = ""
        End If

        strFR = strFR & " AND EXISTS (SELECT 1 FROM Pr PR2 WHERE Pr.WBS1=PR2.WBS1 COLLATE sql_latin1_general_cp1_ci_as " & _
                        " AND Pr.WBS2=PR2.WBS2 COLLATE sql_latin1_general_cp1_ci_as AND Pr.WBS3=PR2.WBS3 COLLATE sql_latin1_general_cp1_ci_as AND UnitTable IS NOT NULL AND (Org " & _
                        " LIKE '%" & filterOffice & "%' OR '" & filterOffice & "'='All'))"

        Try
            dtblLEMList.Dispose()
            dtblLEMList = New DataTable()

            cmdFR.Connection = connSqlFr

            cmdFR.CommandText = " SELECT null PRID, TransDate RepDate, WBS1 + CASE WHEN WBS2 ='' THEN '' ELSE ' - ' + WBS2 END + CASE WHEN WBS3 ='' THEN '' ELSE ' - ' + WBS3 END Project, 'Office Work' Employee, 'Office Work' Name, CONVERT(DECIMAL(5,2), SUM(RegHrs)) Hours, null Uname, null StartTime, CASE WHEN LineItemApprovalStatus='A' THEN 'Approved' ELSE 'Unapproved' END Status " & _
                                " FROM tkdetail tk WHERE TransDate >= @startDate AND TransDate <= @stopDate AND TransDate<=GETDATE()" & _
                                " AND EXISTS (SELECT 1 FROM PR WHERE PR.WBS1=tk.WBS1 AND PR.WBS2=tk.WBS2 AND PR.WBS3=tk.WBS3 AND UnitTable IS NOT NULL AND (Org LIKE '%" & filterOffice & "%' OR '" & filterOffice & "'='All')) AND tk.WBS1 like '%" & filterProject & "%' " & _
                                " GROUP BY TransDate, WBS1 + CASE WHEN WBS2 ='' THEN '' ELSE ' - ' + WBS2 END + CASE WHEN WBS3 ='' THEN '' ELSE ' - ' + WBS3 END, LineItemApprovalStatus ORDER BY Repdate DESC, 3"

            cmdFR.Parameters.Add("@startDate", SqlDbType.DateTime).Value = startDate
            cmdFR.Parameters.Add("@stopDate", SqlDbType.DateTime).Value = stopDate
            cmdFR.Parameters.Add("@PCCode", SqlDbType.VarChar).Value = filterPC

            da = New SqlDataAdapter(cmdFR)
            da.Fill(dtblLEMList)

...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39108295
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем-то MS Access 97 напомнило. Тоже все мышекликами, а как только шаг в сторону захотел сделать - опухни от кодерства.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39114566
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic HunterА что в замен? Вот это? Оно даже компилятором не проверяется. Рантайм-бомба...
Код: vbnet
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.
        If (filterFR = "Unsubmitted") Then
            strFR = " AND FRP.Status='Saved' "
        ElseIf (filterFR = "Submitted") Then
            strFR = " AND FRP.Status='Submitted' "
        ElseIf (filterFR = "TS") Then
            strFR = " AND FRP.Status='TS' "
        ElseIf (filterFR = "NotPrinted") Then
            strFR = " AND WO.PrintStatus IN(0,1) "
        ElseIf (filterFR = "Printed") Then
            strFR = " AND WO.PrintStatus=2 "
        ElseIf (filterProject <> "") Then
            strFR = " AND Pr.WBS1 Like '" & filterProject & "%'"
        Else
            strFR = ""
        End If

        strFR = strFR & " AND EXISTS (SELECT 1 FROM Pr PR2 WHERE Pr.WBS1=PR2.WBS1 COLLATE sql_latin1_general_cp1_ci_as " & _
                        " AND Pr.WBS2=PR2.WBS2 COLLATE sql_latin1_general_cp1_ci_as AND Pr.WBS3=PR2.WBS3 COLLATE sql_latin1_general_cp1_ci_as AND UnitTable IS NOT NULL AND (Org " & _
                        " LIKE '%" & filterOffice & "%' OR '" & filterOffice & "'='All'))"

        Try
            dtblLEMList.Dispose()
            dtblLEMList = New DataTable()

            cmdFR.Connection = connSqlFr

            cmdFR.CommandText = " SELECT null PRID, TransDate RepDate, WBS1 + CASE WHEN WBS2 ='' THEN '' ELSE ' - ' + WBS2 END + CASE WHEN WBS3 ='' THEN '' ELSE ' - ' + WBS3 END Project, 'Office Work' Employee, 'Office Work' Name, CONVERT(DECIMAL(5,2), SUM(RegHrs)) Hours, null Uname, null StartTime, CASE WHEN LineItemApprovalStatus='A' THEN 'Approved' ELSE 'Unapproved' END Status " & _
                                " FROM tkdetail tk WHERE TransDate >= @startDate AND TransDate <= @stopDate AND TransDate<=GETDATE()" & _
                                " AND EXISTS (SELECT 1 FROM PR WHERE PR.WBS1=tk.WBS1 AND PR.WBS2=tk.WBS2 AND PR.WBS3=tk.WBS3 AND UnitTable IS NOT NULL AND (Org LIKE '%" & filterOffice & "%' OR '" & filterOffice & "'='All')) AND tk.WBS1 like '%" & filterProject & "%' " & _
                                " GROUP BY TransDate, WBS1 + CASE WHEN WBS2 ='' THEN '' ELSE ' - ' + WBS2 END + CASE WHEN WBS3 ='' THEN '' ELSE ' - ' + WBS3 END, LineItemApprovalStatus ORDER BY Repdate DESC, 3"

            cmdFR.Parameters.Add("@startDate", SqlDbType.DateTime).Value = startDate
            cmdFR.Parameters.Add("@stopDate", SqlDbType.DateTime).Value = stopDate
            cmdFR.Parameters.Add("@PCCode", SqlDbType.VarChar).Value = filterPC

            da = New SqlDataAdapter(cmdFR)
            da.Fill(dtblLEMList)


А вот это компилятором проверяется, планы выполнения сгенерированных SQL запросов ничем не отличаются от рукописных. И "просто CRUD" я бы это не назвал. :-)
Код: c#
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.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using AppDb;
using SspMain;

namespace AppLogic
{
    public class MessageTaskIndex
    {
        public int? ID;

        public string ProjectStr;

        public string Subject;

        public MessageMember Sender;

        public MessageMember Recipient;

        public DateTime? ActivityDate;

        public DateTime? PlanCompleteDate;

        public MessageState CurrentState;

        public int CommentCount;

        public bool CanChangeMessage;

        public bool MustReadMessage;

        public bool IsTaskNotReaded;

        public bool IsCommentNotReaded;

        public bool IsPlanCompleteDateExpired;
    }

    public class MessageTaskIndexFilter : PaginalFilter
    {
        public int FilterType; // 0 - Текущие задачи, 1 - Избранное, 2 - Поиск по коду задачи, 3 - Расширенный фильтр

        #region Текущие задачи

        public int? F0_Direction;

        public int? F0_Category;

        public int? F0_ProjectID;

        #endregion

        #region Избранное

        public int? F1_FavID;

        #endregion

        #region Поиск по коду задачи

        public int? F2_TaskID;

        #endregion

        #region Расширенный фильтр

        public DateTime? F3_T1;

        public DateTime? F3_T2;

        public int? F3_ProjectID;

        public int? F3_SenderPersID;

        public int? F3_RecipientPersID;

        public string F3_Subject;

        public int[] F3_StateID;

        #endregion
    }

    public class MessageTaskEdit : IMessageAttachmentChangesOwner
    {
        public int? ID;

        public byte[] TaskTimeS;

        public byte[] MessageTimeS;

        public int? ProjectID;

        public int? RecipientPersID;

        public DateTime? PlanCompleteDate;

        public string Subject;

        public string ContentText;

        public MessageAttachmentChanges Attachments { get; set; }
    }

    public class MessageTaskDetail
    {
        // Задача

        public int? ID;

        public string Subject;

        public string ProjectStr;

        public bool CanChangeMessage;

        // Постановка задачи        

        public MessageMember Sender;

        public MessageMember SenderShort;

        public DateTime? CreateDate;

        public DateTime? LastChangeDate;

        public MessageMember LastChangePers;

        // Выполнение

        public MessageMember Recipient;

        public MessageMember RecipientShort;

        public DateTime? RecipientReadDate;

        public bool IsNotReaded;

        public DateTime? PlanCompleteDate;

        public bool IsPlanCompleteDateExpired;

        public MessageState CurrentState;

        public DateTime? CurrentStateDate;

        public DateTime? ActivityDate;

        // Задание

        public string ContentText;
    }

    public class MessageTaskService : DbService,
        IIndexRepository<PaginalResult<MessageTaskIndex>, MessageTaskIndexFilter>,
        IExcelTableRepository<IEnumerable<MessageTaskIndex>, MessageTaskIndexFilter>,
        IEditRepository<MessageTaskEdit, int>
    {
        public CurrentUserService CurrentUserService { get; set; }

        public DbDateTimeService DbDateTimeService { get; set; }

        public MessageCoreService MessageCoreService { get; set; }

        public MessageAttachmentsService MessageAttachmentsService { get; set; }

        #region Index Core

        IQueryable<MessageTaskIndex> GetMessageTaskIndex(IQueryable<message_task> source)
        {
            var currentUserPersID = CurrentUserService.CurrentUserPersID;

            return
                from mt in source

                let m = mt.ID_Reference
                let sender = m.SenderPersID_Reference
                let recipient = m.RecipientPersID_Reference
                let currentStateID = MessageTaskCoreService.GetCurrentStateID.Invoke(mt)

                join currentState in Db.message_taskStates on currentStateID equals currentState.ID

                select new MessageTaskIndex
                {
                    ID = mt.ID,
                    ProjectStr = mt.ProjectID_Reference.Caption,
                    Subject = mt.Subject,
                    Sender = MessageCoreService.GetMessageMemberShort.Invoke(sender, currentUserPersID),
                    Recipient = MessageCoreService.GetMessageMemberShort.Invoke(recipient, currentUserPersID),
                    ActivityDate = MessageTaskCoreService.GetActivityDate.Invoke(mt),
                    PlanCompleteDate = mt.PlanCompleteDate,

                    CurrentState = new MessageState
                    {
                        Caption = currentState.Caption,
                        IsActive = MessageTaskCoreService.GetIsActive.Invoke(mt, currentState)
                    },

                    CommentCount = mt.message_comments_TaskID_Reference.Count(),
                    CanChangeMessage = MessageCoreService.GetCanChangeMessage.Invoke(m, currentUserPersID),
                    MustReadMessage = MessageCoreService.GetMustReadMessage.Invoke(m, currentUserPersID) ?? false,
                    IsTaskNotReaded = MessageCoreService.GetIsNotReadedMessage.Invoke(m, currentUserPersID) ?? false,

                    IsCommentNotReaded =
                        (
                            from mc in mt.message_comments_TaskID_Reference
                            let mcm = mc.ID_Reference
                            where MessageCoreService.GetIsNotReadedMessage.Invoke(mcm, currentUserPersID).Value
                            select mc
                        ).Any(),

                    IsPlanCompleteDateExpired =
                        MessageTaskCoreService.GetIsPlanCompleteDateExpired.Invoke(mt, currentState)
                };
        }

        IQueryable<message_task> GetCurrentUserTasks(Expression<Func<message, bool>> messageFilter)
        {
            var currentUserPersID = CurrentUserService.CurrentUserPersID;

            var currentUserMessages =
                Db.message.Where(m => m.RecipientPersID == currentUserPersID).Where(messageFilter);

            currentUserMessages = currentUserMessages.Concat(
                Db.message.Where(m => m.SenderPersID == currentUserPersID).Where(messageFilter)
            );

            // Мои задачи или задачи моих комментариев
            var currentUserTasksIds =
                (
                    from m in currentUserMessages
                    let c = m.message_comments_ID_Reference
                    select c.TaskID ?? m.ID
                ).Distinct();

            return
                from taskID in currentUserTasksIds
                join mt in Db.message_task on taskID equals mt.ID
                select mt;
        }

        IQueryable<MessageTaskIndex> GetMessageTaskIndexByEfficientFilter
        (
            int direction, // 0 - Все, 1 - Входящие, 2 - Исходящие
            int category, // 1 - Непрочитанные, 2 - Активные, 3 - Недавние
            int? projectID
        )
        {
            if (direction < 0 || direction > 2)
                throw new ArgumentException("direction");

            var currentUserPersID = CurrentUserService.CurrentUserPersID;
            var now = DbDateTimeService.Now;
            IQueryable<message_task> q;

            if (category == 1) // Непрочитанные
            {
                q = GetCurrentUserTasks(m => MessageCoreService.GetIsNotReadedMessage.Invoke(m, currentUserPersID).Value);
            }
            else if (category == 2) // Активные
            {
                var protectDateFrom = now.AddDays(-365);

                q =
                    from mt in GetCurrentUserTasks(m => m.CreateDate >= protectDateFrom && m.CreateDate <= now)
                    let m = mt.ID_Reference

                    // Исключая задачи от моих комментариев
                    where m.RecipientPersID == currentUserPersID || m.SenderPersID == currentUserPersID

                    let currentStateID = MessageTaskCoreService.GetCurrentStateID.Invoke(mt)
                    join currentState in Db.message_taskStates on currentStateID equals currentState.ID
                    where MessageTaskCoreService.GetIsActive.Invoke(mt, currentState)
                    select mt;
            }
            else if (category == 3) // Недавние
            {
                var recentDateFrom = now.AddDays(-30);
                q = GetCurrentUserTasks(m => m.CreateDate >= recentDateFrom && m.CreateDate <= now);
            }
            else
                throw new ArgumentException("category");

            if (direction == 1) // Входящие
                q = q.Where(mt => mt.ID_Reference.RecipientPersID == currentUserPersID);
            else if (direction == 2) // Исходящие
                q = q.Where(mt => mt.ID_Reference.SenderPersID == currentUserPersID);

            if (projectID.HasValue)
                q = q.Where(mt => mt.ProjectID == projectID);

            return GetMessageTaskIndex(q);
        }

        IQueryable<MessageTaskIndex> GetMessageTasIndexByFavID(int favID)
        {
            var q =
                from mt in Db.message_task
                from mtf in mt.message_taskToFavorite_TaskID_Reference
                where mtf.FavID == favID
                select mt;

            return GetMessageTaskIndex(q);
        }

        IQueryable<MessageTaskIndex> GetMessageTaskIndexByID(int id)
        {
            var q = Db.message_task.Where(mt => mt.ID == id);
            return GetMessageTaskIndex(q);
        }

        IQueryable<MessageTaskIndex> GetMessageTaskIndexByExtendedFilter
        (
            DateTime t1, DateTime t2, int? projectID,
            int? senderPersID, int? recipientPersID, string subject,
            int[] stateID
        )
        {
            t1 = t1.Date;
            t2 = t2.Date.AddDays(1);
            stateID = stateID ?? new int[0];

            var q =
                from mt in Db.message_task
                let m = mt.ID_Reference
                let currentStateID = MessageTaskCoreService.GetCurrentStateID.Invoke(mt)
                where m.CreateDate >= t1 && m.CreateDate < t2 && stateID.Contains(currentStateID.Value)
                select new { m, mt };

            if (senderPersID.HasValue)
                q = q.Where(s => s.m.SenderPersID == senderPersID);

            if (recipientPersID.HasValue)
                q = q.Where(s => s.m.RecipientPersID == recipientPersID);

            if (string.IsNullOrWhiteSpace(subject) == false)
                q = q.Where(s => s.mt.Subject.Contains(subject));

            if (projectID.HasValue)
                q = q.Where(s => s.mt.ProjectID == projectID.Value);

            return GetMessageTaskIndex(q.Select(s => s.mt));
        }

        IQueryable<MessageTaskIndex> GetIndexByFilterInternal(MessageTaskIndexFilter filter)
        {
            IQueryable<MessageTaskIndex> q = null;

            if (filter.FilterType == 0)
            {
                if (filter.F0_Direction.HasValue && filter.F0_Category.HasValue)
                    q = GetMessageTaskIndexByEfficientFilter(
                        filter.F0_Direction.Value,
                        filter.F0_Category.Value,
                        filter.F0_ProjectID
                    );
            }
            else if (filter.FilterType == 1)
            {
                if (filter.F1_FavID.HasValue)
                    q = GetMessageTasIndexByFavID(filter.F1_FavID.Value);
            }
            else if (filter.FilterType == 2)
            {
                if (filter.F2_TaskID.HasValue)
                    q = GetMessageTaskIndexByID(filter.F2_TaskID.Value);
            }
            else if (filter.FilterType == 3)
            {
                if (filter.F3_T1.HasValue && filter.F3_T2.HasValue)
                    q = GetMessageTaskIndexByExtendedFilter(
                        filter.F3_T1.Value, filter.F3_T2.Value, filter.F3_ProjectID,
                        filter.F3_SenderPersID, filter.F3_RecipientPersID, filter.F3_Subject,
                        filter.F3_StateID
                    );
            }
            else
                throw new ArgumentException("filterType");

            if (q == null)
                q = GetMessageTaskIndex(Db.message_task.Take(0));

            return q;
        }

        #endregion

        #region IIndexRepository<PaginalResult<MessageTaskIndex>,MessageTaskIndexFilter> Members

        public PaginalResult<MessageTaskIndex> GetIndexByFilter(MessageTaskIndexFilter filter)
        {
            var q = GetIndexByFilterInternal(filter);

            if (filter.FilterType == 3) // Расширенный фильтр
                return q.ToPaginal(filter);

            return q.ToArray().ToPaginal(filter);
        }

        #endregion

        #region IExcelTableRepository<IEnumerable<MessageTaskIndex>,MessageTaskIndexFilter> Members

        public IEnumerable<MessageTaskIndex> GetExcelDataByFilter(MessageTaskIndexFilter filter)
        {
            return GetIndexByFilterInternal(filter).OrderBy(filter);
        }

        #endregion

        #region IEditRepository<MessageTaskEdit,int> Members

        public MessageTaskEdit GetEditNew()
        {
            return new MessageTaskEdit();
        }

        public MessageTaskEdit GetEditByID(int id)
        {
            var q =
                from mt in Db.message_task
                where mt.ID == id
                let m = mt.ID_Reference
                select new MessageTaskEdit
                {
                    ID = mt.ID,
                    TaskTimeS = mt.TimeS,
                    MessageTimeS = m.TimeS,
                    ProjectID = mt.ProjectID,
                    RecipientPersID = m.RecipientPersID,
                    PlanCompleteDate = mt.PlanCompleteDate,
                    Subject = mt.Subject,
                    ContentText = m.ContentText
                };

            return q.First();
        }

        public int SaveEdit(MessageTaskEdit data, UpdateAction action)
        {
            message message;
            message_task message_task;

            if (action == UpdateAction.Insert)
            {
                message = MessageCoreService.CreateMessage();
                Db.AttachAsAdded(message);
                message.ID = -1;

                message_task = new message_task();
                Db.AttachAsAdded(message_task);
                message_task.ID = message.ID;
            }
            else
            {
                MessageCoreService.ValidateCanChangeMessageByID(data.ID.Value);

                message = Db.message.Where(m => m.ID == data.ID).First();
                message_task = Db.message_task.Where(mt => mt.ID == data.ID).First();

                var messageTimeS = Db.Entry(message).Property(v => v.TimeS);
                messageTimeS.OriginalValue = data.MessageTimeS;
                messageTimeS.CurrentValue = data.MessageTimeS;

                var taskTimeS = Db.Entry(message_task).Property(v => v.TimeS);
                taskTimeS.OriginalValue = data.TaskTimeS;
                taskTimeS.CurrentValue = data.TaskTimeS;

                MessageCoreService.SetMessageChanged(message);
            }

            message.RecipientPersID = data.RecipientPersID;
            message.ContentText = data.ContentText;
            message_task.ProjectID = data.ProjectID;
            message_task.PlanCompleteDate = data.PlanCompleteDate;
            message_task.Subject = data.Subject;

            if (data.Attachments != null)
            {
                data.Attachments.MsgID = message.ID;
                MessageAttachmentsService.Attach(data.Attachments);
            }

            Db.SaveChanges();
            return message.ID.Value;
        }

        public void DeleteByID(int id)
        {
            using (new EntityNoDetectChangesScope(Db))
            {
                MessageCoreService.ValidateCanChangeMessageByID(id);

                var qDeleteData =
                    from mt in Db.message_task
                    where mt.ID == id
                    select new
                    {
                        Task = mt,
                        TaskMessage = mt.ID_Reference,
                        Comments =
                            from comment in mt.message_comments_TaskID_Reference
                            select new
                            {
                                Comment = comment,
                                CommentMessage = comment.ID_Reference
                            },
                        Favorites = mt.message_taskToFavorite_TaskID_Reference
                    };

                var deleteData = qDeleteData.First();

                Db.AttachManyAsDeleted(deleteData.Comments.Select(d => d.Comment));
                Db.AttachManyAsDeleted(deleteData.Comments.Select(d => d.CommentMessage));
                Db.AttachManyAsDeleted(deleteData.Favorites);
                Db.AttachAsDeleted(deleteData.Task);
                Db.AttachAsDeleted(deleteData.TaskMessage);

                Db.SaveChanges();
            }
        }

        #endregion

        #region Detail

        public MessageTaskDetail GetDetailByID(int id)
        {
            var currentUserPersID = CurrentUserService.CurrentUserPersID;

            var q =
                from mt in Db.message_task
                where mt.ID == id

                let m = mt.ID_Reference
                let sender = m.SenderPersID_Reference
                let recipient = m.RecipientPersID_Reference
                let lastChangePers = m.LastChangePersID_Reference
                let currentStateID = MessageTaskCoreService.GetCurrentStateID.Invoke(mt)

                join currentState in Db.message_taskStates on currentStateID equals currentState.ID

                select new MessageTaskDetail
                {
                    ID = mt.ID,
                    Subject = mt.Subject,
                    ProjectStr = mt.ProjectID_Reference.Caption,
                    CanChangeMessage = MessageCoreService.GetCanChangeMessage.Invoke(m, currentUserPersID),

                    Sender = MessageCoreService.GetMessageMemberFull.Invoke(sender, currentUserPersID),
                    SenderShort = MessageCoreService.GetMessageMemberShort.Invoke(sender, currentUserPersID),
                    CreateDate = m.CreateDate,
                    LastChangeDate = m.LastChangeDate,
                    LastChangePers = MessageCoreService.GetMessageMemberFull.Invoke(lastChangePers, currentUserPersID),

                    Recipient = MessageCoreService.GetMessageMemberFull.Invoke(recipient, currentUserPersID),
                    RecipientShort = MessageCoreService.GetMessageMemberShort.Invoke(recipient, currentUserPersID),
                    RecipientReadDate = m.RecipientReadDate,
                    IsNotReaded = MessageCoreService.GetIsNotReadedMessage.Invoke(m, currentUserPersID) ?? false,
                    PlanCompleteDate = mt.PlanCompleteDate,
                    IsPlanCompleteDateExpired = MessageTaskCoreService.GetIsPlanCompleteDateExpired.Invoke(mt, currentState),

                    CurrentState = new MessageState
                    {
                        Caption = currentState.Caption,
                        IsActive = MessageTaskCoreService.GetIsActive.Invoke(mt, currentState)
                    },

                    CurrentStateDate = MessageTaskCoreService.GetCurrentStateDate.Invoke(mt),
                    ActivityDate = MessageTaskCoreService.GetActivityDate.Invoke(mt),

                    ContentText = m.ContentText
                };

            return q.First();
        }

        #endregion
    }
}

...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39114897
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS 1. Избавляет от SQL, не нужно знать SQL, больше времени на бизнес логику
2. Меньше и понятный код
3. Меньше ошибок
4. Работает на любой базе
5. Популярный, много доки и инфы


1. нет, SQL знать все равно нужно знать. но если освоить, то действительно эффективность разработки возрастает
2. кода меньше не станет, но организовать его, минимизировав копипасту и увеличив "понятность", легче.
3. ?
4. На многих, если там нативного базозависимого SQL нет
5. Да

PS. это я про NHibernate и C#, но думаю для Hibernate и Java - тоже самое
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39115904
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmaw,
вообще хибер - это прокладка , половине человечества она мешает, другая без неё счас не может.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39115910
ZeroMQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS1. Избавляет от SQL, не нужно знать SQL


Прямо какое-то оскорбление.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39115925
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Был проект с JPA/Hibernate, ну что сказать - для рутинных задач сгодиться. В чем причина использования JPA? Уменьшение времени разработки/прототипирования и более низкая требуемая квалификация разработчиков. Не нужен спец по SQL и процедурам в базе.

В чем недостатки?

1. Больше запросов.
2. Сложно делать разные запросы используя одно дерево объектов (jpa entity). С аннотациями можно поиграться но это не всегда помогает особенно в базе с больше чем 10 таблицами когда нужно в одних случаях загрузить не все поля в объектах или хитрый запрос сделать - с JPA все будет в лоб.
3. В окружениях типа OSGi JPA persistence frameworks сходят с ума (класс лоадеры разные - транзакции летят) - приходится использовать один JPA сервис.

Из плюсов - не нужно заморачиваться с запросами на этапе прототипирования. Хороший вариант - сделать разные обертки для запросов к базе для бизнес логики - на этапе прототипирования использовать JPA DAO, потом сделать оптимизированную имплементацию с JDBC DAO и процедурами в базе где нужно. Опять же все зависит от стоимости проекта, но больших проектах есть смысл не экономить на DBA и разработчиках.

Работоспособна ли JPA в больших проектах? Да. У меня был проект с нагруженной JPA на Websphere, все скрипело но работало (был кластер из баз Оракла, логгирование действий пользователей тоже было в базе, около 10 тыс пользователей, 50 млн транзакций с документами в день) потом некоторые части все-таки перевели на JDBC и процедуры. Был ли большой выигрыш по времени разработки? Нет, весь выигрыш профукали пока маялись с оптимизацией JPA, легче было бы сразу делать нормально. Почему использовался JPA? Интеграторы начинавшие проект сошли с ума и натащили все новомодные игрушки как дети - чего там только не было включая OSGi - большую часть игрушек выкинули из проекта впоследствии пока доводили его до ума после формальной сдачи.Сколько времени профукали на игрушках и сырой архитектуре? Больше полугода.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39115992
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uid unique, проекту явно не хватило толкового архитектора.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116246
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще вопрос возник из того, что изначально занимался разработкой в БД. Потом волею судьбы устроился на работу, где желательно уметь делать и клиент и сервер (хотя изначально в резюм писал, что ищу вакансию разработчик БД, но не об этом). Приоритет отдается Java, что тоже радует. Посмотрел немного SE, ну нормально, поделал простенькие утилитки с доступом к БД через JDBC. Дальше вопросы: а что у нас с созданием веб-интерфейса юзера? Можно ли как-то ускорить и упростить работу с БД? Для сравнения вспомнил, что например, в той же студии создание веб-морды (asp.net) и работа с БД, сделана вполне удобно (хотя пробовал только на простых примерах для себя). А как с этим в Java? Вот и начал тыкаться пока в хибернейт.
Но это все равно как бы немного не то имхо :( Может кто-то подскажет, куда копать в Java, чтобы получить такие же удобные инструменты/среду для разработки, как в той же студии (если это вообще реально).

То есть задача: получить скил создания полноценной веб-морды, работающей с БД желательно с асинхонными запросами со страниц :)
при этом с удобными инструментами/средой разработки.
То есть ну не интересно мне руками рисовать HTML, CSS, XML, не лежит душа что ли, да и кажется это не очень продуктивным :(
хотя от того же JavaScript, видимо, все равно не уйти, но это ладно, потом по-хорошему, надо использовать шаблоны что-то типа xml+xslt или что-то подобное. И хорошо бы все это делать, кидая "контролы" на страничку ), как в той же студии например с минимальной корректировкой руками конфигурационных файлов, в отношении этих "контролов" и прописывая им соотв. свойства в соответствующей панели, сразу наблюдая изменения например внешнего вида, а не ковыряясь с тегами с последующим просмотром в браузере (понятно, что мелочь, но как-то так). Ощущение, что все это уже должно быть, но я не знаю как называется ) JSP? какие-то MVC фреймворки? JSF? Spring?
То есть хотелось бы что-то вроде серверных веб-компонент пользовательского приложения, чтобы писать именно предметную логику и функционал, а не заниматься рисованием тегами и вообще ковырянием в тегах кучи файлов )
В общем пока каша и полное не понимание что курить и куда копать )
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116262
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,
чтобы узнать, как далеко они ушли в базостроении, тебе надо срочно поставить что-то типа grains или play и что-то поделать.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116278
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS, веб-морды, работающие с БД - это либо какой-то небольшой проект на коленке, либо кривое решение.

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

Так что Вы уж определитесь, чего хотите.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116338
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВ нормальных проектах веб-морды с БД напрямую не работают. А есть слой, что Вы назвали "предметная логика и функционал" и к нему уже пишутся веб, десктоп, мобильные и остальные морды.
Имеете в виду, разрабатывается например некая библиотека, в которой приписывается "предметная логика", которая оформляется например в виде веб-сервиса или просто как библиотека, с которой уже работают например те же jsp?
Или подразумевается уже некое готовое решение (сервер приложений или фреймворк, или что там еще), в котором прописывается определенная часть логики, а уже отображение в чем угодно. То есть понятно, что можно например, написать просто веб-сервис,
на вход которого можно слать запросы предопределенного формата, этот сервис выдает на выходе например тупо xml-ки или просто с данными для десктопных например форм, или как шаблоны будущих html-страниц в общем некий универсальный интерфейс.
Наверно тоже полно готовых решений (именно сам каркас, технология)?
skyANAТак что Вы уж определитесь, чего хотите.
Попробую на простом примере:
Есть некая сущность, хранящаяся в БД, необходимо иметь возможность максимально быстро и просто сделать для нее веб-интерфейс для юзера, чтобы можно было ее просматривать, изменять, удалять, добавлять новую (при этом чаще не тупо sel/upd/ins/del, а скорее, что через хранимки в БД, с возможно частично вынесенной логикой в этот т.н. "слой" (см. выше))
При этом чтобы разработка велась на уровне "серверных компонент пользователя", т.е. бросил на макет странички нужные элементы (там эдиты, гриды, батоны, радиобатоны, чекбоксы, табы и т.д.), привязал к данным, прописал что делать в событиях, прописал валидацию, если надо, и готово ).
MasterZivчтобы узнать, как далеко они ушли в базостроении, тебе надо срочно поставить что-то типа grains или play и что-то поделать.
Спасибо, интересно, посмотрю, но мне вроде не нужно строить базу например, через IDE явы, хотя не исключаю, что можно сделать библиотеки, которые покроют большинство потребностей возникающих при создании подобных приложений и возможно, они могут быть даже удобными )
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116583
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSskyANAВ нормальных проектах веб-морды с БД напрямую не работают. А есть слой, что Вы назвали "предметная логика и функционал" и к нему уже пишутся веб, десктоп, мобильные и остальные морды.
Имеете в виду, разрабатывается например некая библиотека, в которой приписывается "предметная логика", которая оформляется например в виде веб-сервиса или просто как библиотека, с которой уже работают например те же jsp?
Или подразумевается уже некое готовое решение (сервер приложений или фреймворк, или что там еще), в котором прописывается определенная часть логики, а уже отображение в чем угодно. То есть понятно, что можно например, написать просто веб-сервис,
на вход которого можно слать запросы предопределенного формата, этот сервис выдает на выходе например тупо xml-ки или просто с данными для десктопных например форм, или как шаблоны будущих html-страниц в общем некий универсальный интерфейс.
Наверно тоже полно готовых решений (именно сам каркас, технология)?Сначала Вы свою прдметную область разбиваете на контуры, направления, части (декомпозиция). Реализуете набор библиотек - слой бизнес логики. Покрываете его тестами.
А потом используете, где хотите. Хотите в веб-сервисе, хотите в веб-приложении, хотите на сервере приложений и т.п.

JDSskyANAТак что Вы уж определитесь, чего хотите.
Попробую на простом примере:
Есть некая сущность, хранящаяся в БД, необходимо иметь возможность максимально быстро и просто сделать для нее веб-интерфейс для юзера, чтобы можно было ее просматривать, изменять, удалять, добавлять новую (при этом чаще не тупо sel/upd/ins/del, а скорее, что через хранимки в БД, с возможно частично вынесенной логикой в этот т.н. "слой" (см. выше))
При этом чтобы разработка велась на уровне "серверных компонент пользователя", т.е. бросил на макет странички нужные элементы (там эдиты, гриды, батоны, радиобатоны, чекбоксы, табы и т.д.), привязал к данным, прописал что делать в событиях, прописал валидацию, если надо, и готово ).Звучит как склепать что-то там на коленке без каких-либо конкретных требований.

Rapid Application Development (быстрая разработка приложений) - это не что-то там куда-то покидать, это хорошо налаженый цикл: Требования - Дизайн - Разработка - Тестирование - Эксплуатация, Фитбек - Требования.
Причём за норму берётся то, что требования в процессе могут устаревать и изменяться.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116587
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А насчёт аналога ASP.NET WebForms, то это вроде как Java Server Faces (JSF).
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116678
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЗвучит как склепать что-то там на коленке без каких-либо конкретных требований.
Rapid Application Development (быстрая разработка приложений) - это не что-то там куда-то покидать, это хорошо налаженный цикл: Требования - Дизайн - Разработка - Тестирование - Эксплуатация, Фитбек - Требования.
Я ж говорю, упрощенно. Не рассматриваю полный цикл (анализ, дизайн, разработка, тестирование и т.д.), в корпоративной разработке участвовал, представление имею. Интересует конкретная часть из этой цепочки - разработка и именно веб c java и именно часть, отвечающая за отображение информации пользователю.
В текущем видении разработка web в Java для меня - это как закат солнца вручную, долго и муторно ), в то время как в той же студии вроде как все делается быстрее и удобнее, многие вещи визуализированы через готовые компоненты (или просто не врубился, т.к. не пробовал, то что надо попробовать, чтобы понять, что в java можно тоже быстро и удобно делать).
Неужели народ пишет на java, только из-за того, что бесплатно, что кроссплатформенный (хотя c# вроде тоже декларируется), что java вроде как шустрее, гибче, не надо тянуть net фреймворк, не смотря на то, что муторно и неудобно (в сравнении с разработкой в той же студии опять же)? Понимаю, что некорректно сравнивать студию и яву, хорошо: NetBeans+java и VisualStudio+c#.
JSF? Ок тоже посмотрю, еще не добрался, но забегая вперед, в том же нетбинзе, когда создаем новый проект, как раз например с JSF, и что там будет возможность разрабатывать макет страницы так же как в студии? В общем в творческом тупике или просто туплю ).
Пока посмотрю немного подробнее jsf.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116719
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSskyANAЗвучит как склепать что-то там на коленке без каких-либо конкретных требований.
Rapid Application Development (быстрая разработка приложений) - это не что-то там куда-то покидать, это хорошо налаженный цикл: Требования - Дизайн - Разработка - Тестирование - Эксплуатация, Фитбек - Требования.
Я ж говорю, упрощенно. Не рассматриваю полный цикл (анализ, дизайн, разработка, тестирование и т.д.), в корпоративной разработке участвовал, представление имею. Интересует конкретная часть из этой цепочки - разработка и именно веб c java и именно часть, отвечающая за отображение информации пользователю.
В текущем видении разработка web в Java для меня - это как закат солнца вручную, долго и муторно ), в то время как в той же студии вроде как все делается быстрее и удобнее, многие вещи визуализированы через готовые компоненты (или просто не врубился, т.к. не пробовал, то что надо попробовать, чтобы понять, что в java можно тоже быстро и удобно делать).
Неужели народ пишет на java, только из-за того, что бесплатно, что кроссплатформенный (хотя c# вроде тоже декларируется), что java вроде как шустрее, гибче, не надо тянуть net фреймворк, не смотря на то, что муторно и неудобно (в сравнении с разработкой в той же студии опять же)? Понимаю, что некорректно сравнивать студию и яву, хорошо: NetBeans+java и VisualStudio+c#.
JSF? Ок тоже посмотрю, еще не добрался, но забегая вперед, в том же нетбинзе, когда создаем новый проект, как раз например с JSF, и что там будет возможность разрабатывать макет страницы так же как в студии? В общем в творческом тупике или просто туплю ).
Пока посмотрю немного подробнее jsf.Понимаете, веб-разработка и то что Вы написали про "Есть некая сущность, хранящаяся в БД, необходимо..." - это совершенно разное :)

То, что Вы пробовали в студии (смешение UI с запросами к БД и какой-то логикой), то в нормальных проектах не используется.
Принято отделять UI от логики и БД.

И народ пишет на Java слой domain model, слой доступа к данным, API. А другой народ прикручивает к этому веб-морду на каком-нибудь модном API, или мобильное приложение.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116757
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuid unique, проекту явно не хватило толкового архитектора.
Там вместо архитектора был диверсант - начал проект и сбежал, другая команда расхлебывала.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116769
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS Ок тоже посмотрю, еще не добрался, но забегая вперед, в том же нетбинзе, когда создаем новый проект, как раз например с JSF, и что там будет возможность разрабатывать макет страницы так же как в студии? В общем в творческом тупике или просто туплю ).
Пока посмотрю немного подробнее jsf.
Если нужно что то быстро насторогать, делайте jsp (тот же сервлет но в виде темплейта, можно не компилить и править руками на лету) - все что нужно набросать (стили и тд) не проблема сделать в Html редакторе. Это если на скорую руку делать.
По нормальному, используются Js frameworks а на сервере реализуются сервисы (в идеале независимые от клиентского api, если есть желание можно подцепить json schema чтоб по аналогии для вебсервисов выдавались метаданные методов).
Есть варианты с GWT/Vaadin и подобные - там веб морда и javascript генерится из Java кода но с ними если попадешь на кастомизацию или баг, наплачешься.

Что используется на проекте зависит от предпочтений архитектора и линии партии - к примеру IBM вложился в dojo, почти все проекты у IBM будут от dojo. Не самый лучший framework, с багами (по крайней мере раньше их было полно), легко делаются утечки памяти но кастомизируется легко и быстро.
jQuery очень часто используется, extJs пореже, из свежих мне понравился Ember (бывшие яблочники писали) - логичный, стройный клиентский js framework но к сожалению в большом деле его пока не пробовал.
...
Рейтинг: 0 / 0
Hibernate и вынос бизнес-логики из СУБД
    #39116829
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИ народ пишет на Java слой domain model, слой доступа к данным, API. А другой народ прикручивает к этому веб-морду на каком-нибудь модном API, или мобильное приложение.
Вот. Другой народ! :) Мне не нравится это разделение ))) не нравится, что имею лишь общее представление, что делает "другой народ", да и не другой местами тоже, а хочется освоить всю цепочку целиком. Но только в том случае, если все это можно делать быстро, то есть надеялся, что есть соответствующие инструменты для этой быстрой целостной связной разработки всех уровней )
uid uniqueЕсли нужно что-то быстро насторогать, делайте jsp. По нормальному, используются Js frameworks, а на сервере реализуются сервисы (в идеале независимые от клиентского api, если есть желание можно подцепить json schema чтоб по аналогии для вебсервисов выдавались метаданные методов).
skyANA об этом же говорит похоже, но это уже немного более конкретный вариант по-моему, т.е. Js frameworks, а на сервере просто сервисы? Ок. Веб-сервисы примерно понятно - запрос/какие-то действия/ответ. Js frameworks - это что-то из этого ? Посмотрю, что за звери. То есть с помощью Js frameworks можно быстро пилить интерактивные веб-странички, которые будут тыкаться в сервис, получая/оперируя данными или сразу готовые куски хтмл или еще что, в общем на выходе веб-UI? Не улавливаю пока только, как там будет реализовано именно создание страницы на сервере (js frameworks javascript - это ж клиент). С jsp понятно - есть страничка, запросили, выполнился ее код на сервере, сгенерив html-ку с данными, кот. улетела юзеру. В чем принципиальное отличие создания страниц с помощью js frameworks? Или как раз именно тем, что есть палитра уже готовых компонент, типа как в той же студии? А темплейтность как?
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Hibernate и вынос бизнес-логики из СУБД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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