+1 امتیاز
قبل در برنامه نویسی توسط (15 امتیاز)
ویرایش شده قبل توسط

چطور می توان در play framework، زمانی که از JPA.withTransaction استفاده می کنیم و در زمان Insert به خطاهایی مانند UniqueConstraintViolation برمی خوریم، این خطا را هندل کنیم؟ چون JPA تمام این خطاهارو به RunTimeException می اندازد...

قبل توسط (1.1هزار امتیاز)
چرا از متد JPA.withTransaction استفاده می کنید؟ این متد بیشتر برای تست کاربرد داره.
قبل توسط (15 امتیاز)
ویرایش شده قبل توسط
خب اگه منظورتون استفاده از @Transaction هست که بازم مشکل رو حل نمی کنه. موضوع گرفتن Exception هایی از این دست هست که در ارتباط با دیتابیس بهش برمی خوریم ولی نمیشه Catch کرد. فکر کنید کاربر بخواهد در یک سامانه شماره موبایل تکراری وارد کند و این فیلد در دیتابیش Unique باشد. چطور پیغام اینکه این شماره تکراری است را می توان پس از اینکه در Exception موردنظر افتاد هندل می کنید؟

1 پاسخ

0 امتیاز
قبل توسط (1.1هزار امتیاز)
ویرایش شده قبل توسط

از Play 2.4 استراتژی تیم Play این شده که global state ها مثل همین کلاس JPA از Play حذف بشه و همه چی بر مبنای Dependency Injection جلو بره. global state ها بیشتر کار راه اندازن و برای مواردی که شما می خواهید توضیه می کنیم اگر از Play 2.3 استفاده می کنید، پروژه خود را با Spring یا Guice ستاپ کنید و اگر از Play 2.4 استفاده می کنید از JPAApi استفاده کنید تا کنترل کاملتری بر روی معماری و کامپوننت های پزوژه خود داشته باشید.

برای مثال شما برای تشخیص خطای UniqueConstraintViolation باید یک try catch برای متد persist بگذارید و خطای PersistenceException را catch کنید و بصورت زیر آن را پردازش کنید:

        Task task = new Task();
        task.setTaskTitle("test task");

        try {
            JPA.em().persist(task);
        }catch (PersistenceException e){
            System.out.println("----"+e.getCause().getCause().getMessage());
        }
قبل توسط (15 امتیاز)
من از play2.4 استفاده می کنم. متاسفانه جوابم رو نگرفتم.
قبل توسط (1.1هزار امتیاز)
JPAApi به شما EntityManager می دهد و شما می تونید ادامه داستان رو مثل سابق جلو ببرید مشکل کجاست؟
قبل توسط (1.1هزار امتیاز)
یا  اینکه EntityManager رو بدین به Spring و با Spring Transaction به مدیریت Transaction بپردازید.
قبل توسط (15 امتیاز)
شما این خط کد را در نظر بگیرید در متدی با @Transaction :
JPA.em().persist(user);
خب اگر منظور شما از JPAAPI این باشه و در ضمن فیلد موبایل برای unique، user باشه باید خطای UniqueConstraintViolation بده ولی توی RunTimeException می افته. سوال من اینجاست که چطور میشه UniqueConstraintViolation رو Catch کردو پیغام مرتبط داد؟
قبل توسط (1.1هزار امتیاز)
جواب ویرایش شد.
قبل توسط (15 امتیاز)
متاسفانه تکه کدی که شما نوشتید در صورتیکه آبجکت Task فیلد unique داشته باشد و انتظار ConstraintViolationException داشته باشید هیچ وقت در Catch نمی افته و این دقیقا سوال منه که چرا؟
قبل توسط (1.1هزار امتیاز)
من همین کد رو تست کردم و تو catch میوفته.
قبل توسط (95 امتیاز)
حالا اگه کسی بخواد دو تا instance  از EntityManager داشته باشه باید چی کار کنه
JPA.em() به نظر میرسه Singleton باشه
نمیدونم آینده زبانهایی مثل اسکالا چیه ولی خیلی خوبه که فریم  ورکهایی مثل Akka با این زبانها پدید اومده
قبل توسط (1.1هزار امتیاز)
نکته اول: خود JPA.em یه پارامتر String میگیره که نام DataSource هست و EntityManager مربوط به اون DataSource رو بر می گردونه.
نکته دوم: میشه کلا به راحتی بجث JPA و ارتباط به دیتابیس تو Play رو سپرد دست Spring و طبق استاندارد های repository های Spring کد زد.
نکته سوم: تمام مباحث مطرح شده در این سوال درباره جاوا نه اسکالا !!! اسکالا از JPA استفاده نمی کنه و لایبرری با نام Slick داره که FRM که اصلا تو دنیای جاوا وجود نداره.
قبل توسط (95 امتیاز)
پس برمیگرده به فریم ورک Play اصولا از نظر معماری بهتره تا حد ممکن از یک فریم ورک برای IoC و Bean Management استفاده کرد نمیدونم Play تا چه حد این رو مدیریت میکنه یا اصلا موقعیکه در جاوا ازش استفاده میکنیم باید خود Play رو با Spring مدیدیریت کنیم.
نکته دوم در دنیای واقعی پیش میاد حداقل برای Grails به عینه دیدم Scalaرو نمیدونم که تیمی برای صرفه جویی در وقت از کتابخانه ای که توسط تیم دیگری مثلا با JPA نوشته شده مجبور شده استفاده کنه خوب اگه در Scala به همچین کیسی میش بیاد دیگه با توجه به مدیریت پروژه معمار تیم اجازه نمیده او منطق کاری دوباره  با تکنولوژی مثل Slick نوشته بشه یعنی در اسکالا مجبوری از JPA استفاده کنی
سوالم اینجاست که البته بهتره یه این رو در قالب سوال در جواب یاب بگم و این بحث رو اونجا منتقل کنیم
چطور در اسکالا با استفاده از Play میتوان از JPA استفاده کرد؟
سوال دوم چطور میتوان EntityManager رو در Play بدون وابسته شدن به فریم دیگری مثل Spring مدیریت کرد؟
قبل توسط (1.1هزار امتیاز)
هر دو مورد که گفتید به راحتی امکان پذیره و روش کار شده. منم موافقم در قالب سوال در جواب یاب مطرح بشه که بقیه هم روش بحث کنن.

سوالات مشابه

+1 امتیاز
1 پاسخ 425 بازدید
+1 امتیاز
1 پاسخ 542 بازدید
0 امتیاز
1 پاسخ 581 بازدید
0 امتیاز
1 پاسخ 483 بازدید
سوال شده 9 سال قبل در برنامه نویسی توسط ehsolimo (302 امتیاز)
+1 امتیاز
1 پاسخ 449 بازدید
+1 امتیاز
1 پاسخ 508 بازدید
0 امتیاز
0 پاسخ 295 بازدید
...