رفع خطای can bind a LONG value only for insert into a LONG column در پایگاه داده‌ی اوراکل

۲ مرداد ۱۳۹۶
بیش از هر چیز باید بگویم که این نوشته مربوط به برنامه‌نویسی در فریم‌ورک اسپرینگ و هایبرنیت همراه با دیتابیس اوراکل است؛ اگر با این فریم‌ورک آشنایی ندارید، خواندن این نوشته‌ی من در مورد این چهارچوب برنامه‌نویسی می‌تواند برای شما مفید باشد. پایگاه داده‌ی اوراکل (oracle) جزء قوی‌ترین پایگاه‌داده‌ها یا DBMS در دنیای نرم‌افزار به شمار می‌رود. از جمله ویژگی‌های آن می‌توان به سرعت بالا در دسترسی به داده‌ها، ضریب امنیتی بالا، کنترل همزمانی، توانایی نگهداری حجم انبوه اطلاعات و ... اشاره نمود. در این نوشته به بررسی یک مشکل که به هنگام ذخیره یک فایل در اوراکل ممکن است پیش بیاید، می‌پردازیم.

معمولا برای ذخیره فایل یک property با نوع داده‌ای []byte در پایگاه داده در فایل هایبرنیت از نوع binary استفاده می‌کنیم:
//In Model
private byte[]     answerImage;

//In Hibernate file (.hbm.xml)
<property  name="answerImage"  column="answer_image" type="binary" not-null="true" />


در این حالت در پایگاه داده اوراکل نوع داده‌ای (RAW(255 برای این ستون در نظر گرفته می‌شود؛ اما این امر باعث می‌شود که در هنگاه ذخیره یک فایل (مثلا یک تصویر) در پایگاه داده با خطای زیر مواجه شویم:
ERROR: ORA-01461: can bind a LONG value only for insert into a LONG column
دلیل این خطا محدودیت اندازه نوع داده‌ای (RAW(255 است. حال اگر در فایل هایبرنت نوع ستون را به blob تغییر دهیم؛
 <property  name="answerImage"  column="answer_image" type="blob" not-null="true" />
 در اینصورت با خطای زیر مواجه می‌شویم:
ERROR: B cannot be cast to java.sql.Blob
دلیل این خطا این است که در سطح هایبرنت، تبدیل نوع از باینری به blob نمی‌تواند انجام شود.

راه‌حل: برای رفع این مشکل بایستی در فایل هایبرنت برای نوع ستون از همان نوع binary استفاده نمود و در پایگاه داده به صورت دستی نوع ستون را از (RAW(255 به blob تغییر داد.

هیچ نظری موجود نیست: