জেপিএতে কলামগুলির জন্য ডিফল্ট মান নির্ধারণ করা


245

জেপিএতে কলামগুলির জন্য একটি ডিফল্ট মান সেট করা সম্ভব এবং যদি, টীকাগুলি ব্যবহার করে এটি কীভাবে করা হয়?


জেপিএ সেপিসিফিকেশনে রয়েছে যেখানে আমি কলামের জন্য অন্য কলামের মান হিসাবে ডিফল্ট মান রাখতে পারি, কারণ আমি এটি লুকিয়ে রাখতে চাই
শরিফ

3
সম্পর্কিত: হাইবারনেট হয়েছে @ org.hibernate.annotations.ColumnDefault ( "foo বিন্যাস")
Ondra Žižka

উত্তর:


230

প্রকৃতপক্ষে জেপিএতে এটি সম্ভব, যদিও টীকাগুলির columnDefinitionসম্পত্তি ব্যবহার করে কিছুটা হ্যাক করা সম্ভব @Column, যেমন:

@Column(name="Price", columnDefinition="Decimal(10,2) default '100.00'")

3
10 হল পূর্ণসংখ্যার অংশ এবং 2 হ'ল সংখ্যার দশমিক অংশ তাই: 1234567890.12 একটি সমর্থিত সংখ্যা হবে।
নাথান ফেজার

23
আরও মনে রাখবেন, এই কলাম ডিফিনিশনটি অগত্যা ডেটাবেস স্বাধীন নয় এবং অবশ্যই জাভাতে ডেটাটাইপটি স্বয়ংক্রিয়ভাবে আবদ্ধ নয়।
নাথান ফেজার

47
নাল ক্ষেত্রের সাথে একটি সত্তা তৈরি করার পরে এবং এটি চালিয়ে যাওয়ার পরে, আপনি এতে মান সেট করবেন না। কোনও সমাধান নয় ...
পাস্কাল থিভেন্ট

18
নাথনফিজার নয়, 10 দৈর্ঘ্য এবং 2 দশমিক অংশ। সুতরাং 1234567890.12 ওয়াড একটি সমর্থিত নম্বর হবে না, তবে 12345678.90 বৈধ।
জিপিআরমোলা

4
আপনার প্রয়োজন হবে insertable=falseযদি কলামটি স্থূল হয় (এবং অনির্দেশক কলাম যুক্তি এড়াতে)।
eckes

314

আপনি নিম্নলিখিতটি করতে পারেন:

@Column(name="price")
private double price = 0.0;

সেখানে! আপনি সবেমাত্র শূন্যকে ডিফল্ট মান হিসাবে ব্যবহার করেছেন।

আপনি যদি এই অ্যাপ্লিকেশন থেকে কেবল ডাটাবেস অ্যাক্সেস করেন তবে এটি আপনাকে পরিবেশন করবে নোট করুন। যদি অন্যান্য অ্যাপ্লিকেশনগুলিও ডেটাবেস ব্যবহার করে, তবে আপনার ক্যামেরনের কলাম ডিফিনিশন টীকা বিশিষ্টতা বা অন্য কোনও উপায়ে ব্যবহার করে ডাটাবেস থেকে এই চেক করা উচিত ।


38
যদি আপনি সন্নিবেশের পরে আপনার সত্তাগুলির সঠিক মান রাখতে চান তবে এটি করার সঠিক উপায়। +1
পাস্কেল থিভেন্ট

16
মডেল শ্রেণিতে একটি নলযোগ্য বৈশিষ্ট্যের (যেটি একটি প্রাক-প্রাক-জাতীয় টাইপযুক্ত) এর ডিফল্ট মান নির্ধারণ করে এমন মানদণ্ডের প্রশ্নগুলি ভেঙে দেবে Exampleযা অনুসন্ধানের প্রোটোটাইপ হিসাবে কোনও অবজেক্টকে ব্যবহার করে। ডিফল্ট মান নির্ধারণের পরে, একটি হাইবারনেট উদাহরণ ক্যোয়ারী আর সম্পর্কিত কলামটিকে অগ্রাহ্য করবে না যেখানে পূর্বে এটি এটিকে উপেক্ষা করবে কারণ এটি বাতিল ছিল। একটি হাইবারনেট save()বা update()। এটি আরও ভাল ডাটাবেসের আচরণের নকল করে যা ডিফল্ট মান সেট করে যখন এটি একটি সারি সংরক্ষণ করে।
ডেরেক মাহর

1
@ হ্যারি: আপনি যখন মানদণ্ডের অনুসন্ধানগুলি ব্যবহার করেন যা অনুসন্ধানের প্রোটোটাইপ হিসাবে উদাহরণ ব্যবহার করে তখনই এটি ডিফল্ট মান নির্ধারণের সঠিক উপায় way
ডেরেক মাহর

12
এটি নিশ্চিত করে না যে ডিফল্টটি আদিম প্রকারের জন্য সেট করা আছে ( nullউদাহরণস্বরূপ সেটিং )। ব্যবহার @PrePersistএবং @PreUpdateএকটি ভাল বিকল্প imho।
জ্যাস্পার

3
এটি কলামের জন্য ডিফল্ট মান নির্দিষ্ট করার সঠিক উপায়। columnDefinitionসম্পত্তি ডেটাবেস-স্বতন্ত্র নয় এবং @PrePersistsettingোকানোর আগে আপনার সেটিংসকে ওভাররাইড করে, "ডিফল্ট মান" অন্য কিছু হয়, যখন মানটি স্পষ্টভাবে সেট না করা হয় তখন ডিফল্ট মান ব্যবহৃত হয়।
উত্কু dezdemir

110

আর একটি পদ্ধতি javax.persistance.PrePersist ব্যবহার করছে

@PrePersist
void preInsert() {
   if (this.createdTime == null)
       this.createdTime = new Date();
}

1
টাইমস্ট্যাম্পগুলি যুক্ত করার জন্য এবং আপডেট করার জন্য আমি এই জাতীয় একটি পদ্ধতির ব্যবহার করেছি। এটি খুব ভাল কাজ করেছে।
স্পিনা

10
এই if (createdt != null) createdt = new Date();বা কিছু না হওয়া উচিত? এখনই, এটি একটি স্পষ্টভাবে নির্দিষ্ট মানটিকে ওভাররাইড করবে, যা মনে হয় এটি সত্যই একটি ডিফল্ট নয় be
সর্বাধিক ন্যানসি

16
@ ম্যাক্সন্যানসিif (createdt == null) createdt = new Date();
শেন

ক্লায়েন্ট এবং ডাটাবেস বিভিন্ন টাইম জোনে থাকলে কি ব্যাপার হবে? আমি কল্পনা করেছি যে "টাইমস্ট্যাম্প ডিফল্ট করুরএনটিটাইমএসএএমপি" এর মতো কিছু ব্যবহার করে ডাটাবেস সার্ভারে বর্তমান সময় পাওয়া যাবে এবং জাভ কোডটিতে "ক্রিয়েট = নতুন তারিখ ()" পাওয়া যাবে তবে এই দুটি সময় একই নাও হতে পারে যদি ক্লায়েন্টটি একটি ভিন্ন সময় অঞ্চলে একটি সার্ভারের সাথে সংযুক্ত হচ্ছে।
হতাশিত

nullচেক যোগ করা হয়েছে ।
ওন্দ্র Žižka

49

2017 সালে, জেপিএ 2.1 এর এখনও কেবলমাত্র @Column(columnDefinition='...')আপনি কলামটির আক্ষরিক এসকিউএল সংজ্ঞা দিয়েছেন। যা পুরোপুরি নমনীয় এবং প্রকারের মতো অন্যান্য দিকগুলিও আপনাকে ঘোষনা করতে বাধ্য করে, সেই বিষয়ে জেপিএ বাস্তবায়নের দৃষ্টিভঙ্গিকে সংক্ষিপ্তসার্কিট করে।

হাইবারনেট যদিও, এটি আছে:

@Column(length = 4096, nullable = false)
@org.hibernate.annotations.ColumnDefault("")
private String description;

ডিডিএল এর মাধ্যমে সম্পর্কিত কলামে প্রয়োগ করার জন্য ডিফল্ট মান চিহ্নিত করে।

দুটি নোট:

1) অ-স্ট্যান্ডার্ড যেতে ভয় পাবেন না। জেবস ডেভেলপার হিসাবে কাজ করা, আমি বেশ কয়েকটি স্পেসিফিকেশন প্রক্রিয়া দেখেছি। স্পেসিফিকেশনটি মূলত সেই বেসলাইন যা প্রদত্ত মাঠে বড় খেলোয়াড়রা পরের দশক বা তার জন্য সমর্থন করতে প্রতিশ্রুতিবদ্ধ। এটি সুরক্ষার জন্য, বার্তাগুলির জন্য সত্য, ওআরএম কোনও পার্থক্য নয় (যদিও জেপিএ বেশিরভাগই কভার করে)। বিকাশকারী হিসাবে আমার অভিজ্ঞতা হ'ল জটিল অ্যাপ্লিকেশনটিতে, যত তাড়াতাড়ি বা পরে আপনার যেকোনভাবে একটি অ-মানক API দরকার হবে। আর @ColumnDefaultএকটি উদাহরণ যখন এটি একটি অ-মানক সলিউশন ব্যবহার নেগেটিভ outweigts হয়।

2) সবাই মিলে @PersPersist বা কনস্ট্রাক্টর সদস্যের সূচনাটি কীভাবে তরঙ্গ করে তা চমৎকার। তবে এটি এক নয়। কীভাবে বাল্ক এসকিউএল আপডেটগুলি সম্পর্কে? যে বিবৃতিগুলি কলামটি সেট করে না সেগুলি সম্পর্কে কীভাবে? DEFAULTএর ভূমিকা আছে এবং এটি জাভা শ্রেণির সদস্যকে সূচনা করে বিকল্প পরিবর্তনযোগ্য নয়।


ওয়াইল্ডফ্লাই 12 এর জন্য হাইবারনেট-টীকাগুলির কোন সংস্করণ আমি ব্যবহার করতে পারি, এর নির্দিষ্ট সংস্করণে আমি একটি ত্রুটি ধরছি? ধন্যবাদ অগ্রিম!
ফার্নান্দো পাই

ধন্যবাদ ওন্দ্র 2019 এ আরও কি কোনও সমাধান আছে?
অ্যালান

1
দু: খজনকভাবে @ এলান স্টক জেপিএতে নেই।
জেভেন্টিং

13

জেপিএ এটি সমর্থন করে না এবং এটি যদি তা করে তবে তা কার্যকর হবে। কলামডিফিনিশনটি ডিবি-নির্দিষ্ট এবং বেশিরভাগ ক্ষেত্রে গ্রহণযোগ্য নয় Using ক্লাসে ডিফল্ট সেট করা যথেষ্ট নয় যখন আপনি শূন্য মানগুলি রেকর্ডটি পুনরুদ্ধার করেন (যা সাধারণত আপনি যখন পুরানো ডিবিউনিট পরীক্ষাগুলি পুনরায় চালিত করেন)। আমি যা করি তা হ'ল:

public class MyObject
{
    int attrib = 0;

    /** Default is 0 */
    @Column ( nullable = true )
    public int getAttrib()

    /** Falls to default = 0 when null */
    public void setAttrib ( Integer attrib ) {
       this.attrib = attrib == null ? 0 : attrib;
    }
}

জাভা অটো-বক্সিং এতে অনেক সহায়তা করে।


সেটটারদের অপব্যবহার করবেন না! তারা একটি বস্তুর ক্ষেত্রে একটি পরামিতি সেট করার জন্য। বেশি না! ডিফল্ট মানগুলির জন্য আরও ভাল ব্যবহার ডিফল্ট কনস্ট্রাক্টর।
রোল্যান্ড

@ রোল্যান্ড তত্ত্বের ক্ষেত্রে দুর্দান্ত, তবে ইতিমধ্যে এমন নালিকাগুলি রয়েছে যেখানে আপনার অ্যাপ্লিকেশনটি সেগুলি না রাখতে চায় এমন কোনও বিদ্যমান ডাটাবেস নিয়ে কাজ করার সময় সর্বদা কাজ করবে না। আপনাকে প্রথমে একটি ডাটাবেস রূপান্তর করতে হবে যেখানে আপনি কলামটি শূন্য নয় এবং একই সাথে একটি বোধগম্য ডিফল্ট সেট করবেন এবং তারপরে অন্যান্য অ্যাপ্লিকেশনগুলির ব্যাকলেশকে মোকাবেলা করুন যা ধরে নিবে যে এটি বাস্তবে অবনমিত (যদি আপনি এটি করেন তবে এমনকি ডাটাবেস পরিবর্তন করতে পারে)।
জেভিং

যদি এটি # জেপিএ এবং সেটার / গেটারগুলির কাছে আসে তবে আপনার অ্যাপ্লিকেশনটি বেড়ে ওঠার পরে একদিন সেগুলি অবশ্যই সর্বদা খাঁটি সেটার / গ্রাহক হতে হবে এবং একটি রক্ষণাবেক্ষণ দুঃস্বপ্নে পরিণত হবে। সেরা পরামর্শটি এখানে KISS (আমি কোনও সমকামী নয়, LOL)।
রোল্যান্ড

10

একই সমস্যাটি সমাধান করার চেষ্টা করার সময় আমি যখন গুগলের কাছ থেকে এই হোঁচট খেয়েছি, দেখেছি যে কেউ যদি এটির কাজে লাগে সে ক্ষেত্রে আমি যে সমাধানটি রান্না করেছিলাম তা আমিই ফেলে দিতে চাই।

আমার দৃষ্টিকোণ থেকে এই সমস্যাটির সত্যই 1 টি সমাধান রয়েছে - @ প্রিপারসিস্ট ist আপনি যদি এটি @PerPersist এ করেন, তবে আপনাকে মানটি ইতিমধ্যে সেট করা আছে কিনা তা পরীক্ষা করে দেখতে হবে।


4
+1 - আমি অবশ্যই @PrePersistওপির ব্যবহারের জন্য বেছে নেব। @Column(columnDefinition=...)খুব মার্জিত মনে হয় না।
পাইওটার নওইকি

স্টোরটিতে নাল মান সহ যদি ইতিমধ্যে ডেটা থাকে তবে @ প্রিপার্সিস্ট আপনাকে সাহায্য করবে না। এটি আপনার জন্য ম্যাজিকভাবে কোনও ডাটাবেস রূপান্তর করবে না।
জ্বলন্ত

10
@Column(columnDefinition="tinyint(1) default 1")

আমি সবেমাত্র বিষয়টি পরীক্ষা করেছি। এটা ঠিক কাজ করে। ইঙ্গিতটির জন্য ধন্যবাদ।


মন্তব্য সম্পর্কে:

@Column(name="price") 
private double price = 0.0;

এটি এক ডাটাবেসে ডিফল্ট কলাম মান সেট করে না (অবশ্যই)।


9
এটি অবজেক্ট পর্যায়ে সূক্ষ্মভাবে কাজ করে না (আপনি নিজের সত্তায় প্রবেশের পরে ডাটাবেস ডিফল্ট মান পাবেন না)। জাভা স্তরে ডিফল্ট।
পাসক্ল থিভেন্ট

এটি কাজ করে (বিশেষত যদি আপনি সন্নিবেশযোগ্য = ডেটাবেজে মিথ্যা নির্দিষ্ট করে থাকেন তবে দুর্ভাগ্যক্রমে ক্যাশেড সংস্করণটি রিফ্রেশ হয় না (জেপিএ টেবিল এবং কলামগুলি নির্বাচন করে নাও। রাউন্ডট্রিপটি খারাপ
অগস্ট

9

আপনি জাভা প্রতিফলিত এপিআই ব্যবহার করতে পারেন:

    @PrePersist
    void preInsert() {
       PrePersistUtil.pre(this);
    }

এটি সাধারণ:

    public class PrePersistUtil {

        private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");


        public static void pre(Object object){
            try {
                Field[] fields = object.getClass().getDeclaredFields();
                for(Field field : fields){
                    field.setAccessible(true);
                    if (field.getType().getName().equals("java.lang.Long")
                            && field.get(object) == null){
                        field.set(object,0L);
                    }else if    (field.getType().getName().equals("java.lang.String")
                            && field.get(object) == null){
                        field.set(object,"");
                    }else if (field.getType().getName().equals("java.util.Date")
                            && field.get(object) == null){
                        field.set(object,sdf.parse("1900-01-01"));
                    }else if (field.getType().getName().equals("java.lang.Double")
                            && field.get(object) == null){
                        field.set(object,0.0d);
                    }else if (field.getType().getName().equals("java.lang.Integer")
                            && field.get(object) == null){
                        field.set(object,0);
                    }else if (field.getType().getName().equals("java.lang.Float")
                            && field.get(object) == null){
                        field.set(object,0.0f);
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    }

2
আমি এই সমাধানটি পছন্দ করি তবে দুর্বলতার একটি বিন্দু রয়েছে বলে আমি মনে করি যে কলামটি পূর্বনির্ধারিত মান নির্ধারণের আগে কলামটি বাতিল হয় কিনা তা গুরুত্বপূর্ণ পরীক্ষা করা উচিত।
লুইস কার্লোস

আপনি যদি পছন্দ করেন তবে কোডটি কোড থেকে Field[] fields = object.getClass().getDeclaredFields();প্রবেশ for()করাও ঠিক আছে। এবং দুর্ঘটনাক্রমে আপনি সংশোধন finalকরতে চান না objectবলে আপনার পরামিতি / ধরা ব্যতিক্রমগুলিতে যুক্ত করুন । এছাড়াও উপর একটি চেক যোগ null: if (null == object) { throw new NullPointerException("Parameter 'object' is null"); }। এটি নিশ্চিত করে যে object.getClass()এটি প্রার্থনা করা নিরাপদ এবং কোনটি ট্রিগার করে না NPE। কারণটি অলস প্রোগ্রামারগুলির ভুল এড়ানো। ;-)
রোল্যান্ড

7

আমি ব্যবহার করি columnDefinitionএবং এটি খুব ভাল কাজ করে

@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")

private Date createdDate;

6
দেখে মনে হচ্ছে এটি আপনার জেপিএ প্রয়োগকারী বিক্রেতাকে নির্দিষ্ট করে।
উদো 21

এটি কেবলমাত্র ডিডিএল বিক্রেতাকে নির্দিষ্ট করে তোলে। তবে আপনার সম্ভবত সম্ভবত বিক্রেতার নির্দিষ্ট ডিডিএল হ্যাক রয়েছে .. তবে উপরে বর্ণিত মান অনুযায়ী (সন্নিবেশযোগ্য = মিথ্যা হলেও) ডিবিতে প্রদর্শিত হবে তবে সেশনের সত্তা ক্যাশে নয় (অন্তত হাইবারনেটে নয়)।
eckes

7

কলাম টীকা দিয়ে আপনি এটি করতে পারবেন না। আমি মনে করি একমাত্র উপায় হ'ল যখন কোনও বস্তু তৈরি হবে তখন ডিফল্ট মান সেট করা। সম্ভবত এটির জন্য ডিফল্ট কনস্ট্রাক্টর সঠিক জায়গা হবে।


চমৎকার ধারণা. দুর্ভাগ্যক্রমে @Columnচারপাশের জন্য কোনও জেনেরিক টিকা বা গুণ নেই । এবং আমি মন্তব্যগুলি সেট করা (জাভা ডক্ট্যাগ থেকে নেওয়া) মিস করছি।
রোল্যান্ড

5

আমার ক্ষেত্রে আমি হাইবারনেট-কোর উত্স কোডটি সংশোধন করেছি, একটি নতুন টিকা প্রবর্তনের জন্য @DefaultValue:

commit 34199cba96b6b1dc42d0d19c066bd4d119b553d5
Author: Lenik <xjl at 99jsj.com>
Date:   Wed Dec 21 13:28:33 2011 +0800

    Add default-value ddl support with annotation @DefaultValue.

diff --git a/hibernate-core/src/main/java/org/hibernate/annotations/DefaultValue.java b/hibernate-core/src/main/java/org/hibernate/annotations/DefaultValue.java
new file mode 100644
index 0000000..b3e605e
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/annotations/DefaultValue.java
@@ -0,0 +1,35 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+
+/**
+ * Specify a default value for the column.
+ *
+ * This is used to generate the auto DDL.
+ *
+ * WARNING: This is not part of JPA 2.0 specification.
+ *
+ * @author 谢继雷
+ */
+@java.lang.annotation.Target({ FIELD, METHOD })
+@Retention(RUNTIME)
+public @interface DefaultValue {
+
+    /**
+     * The default value sql fragment.
+     *
+     * For string values, you need to quote the value like 'foo'.
+     *
+     * Because different database implementation may use different 
+     * quoting format, so this is not portable. But for simple values
+     * like number and strings, this is generally enough for use.
+     */
+    String value();
+
+}
diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java
index b289b1e..ac57f1a 100644
--- a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java
+++ b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java
@@ -29,6 +29,7 @@ import org.hibernate.AnnotationException;
 import org.hibernate.AssertionFailure;
 import org.hibernate.annotations.ColumnTransformer;
 import org.hibernate.annotations.ColumnTransformers;
+import org.hibernate.annotations.DefaultValue;
 import org.hibernate.annotations.common.reflection.XProperty;
 import org.hibernate.cfg.annotations.Nullability;
 import org.hibernate.mapping.Column;
@@ -65,6 +66,7 @@ public class Ejb3Column {
    private String propertyName;
    private boolean unique;
    private boolean nullable = true;
+   private String defaultValue;
    private String formulaString;
    private Formula formula;
    private Table table;
@@ -175,7 +177,15 @@ public class Ejb3Column {
        return mappingColumn.isNullable();
    }

-   public Ejb3Column() {
+   public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public Ejb3Column() {
    }

    public void bind() {
@@ -186,7 +196,7 @@ public class Ejb3Column {
        }
        else {
            initMappingColumn(
-                   logicalColumnName, propertyName, length, precision, scale, nullable, sqlType, unique, true
+                   logicalColumnName, propertyName, length, precision, scale, nullable, sqlType, unique, defaultValue, true
            );
            log.debug( "Binding column: " + toString());
        }
@@ -201,6 +211,7 @@ public class Ejb3Column {
            boolean nullable,
            String sqlType,
            boolean unique,
+           String defaultValue,
            boolean applyNamingStrategy) {
        if ( StringHelper.isNotEmpty( formulaString ) ) {
            this.formula = new Formula();
@@ -217,6 +228,7 @@ public class Ejb3Column {
            this.mappingColumn.setNullable( nullable );
            this.mappingColumn.setSqlType( sqlType );
            this.mappingColumn.setUnique( unique );
+           this.mappingColumn.setDefaultValue(defaultValue);

            if(writeExpression != null && !writeExpression.matches("[^?]*\\?[^?]*")) {
                throw new AnnotationException(
@@ -454,6 +466,11 @@ public class Ejb3Column {
                    else {
                        column.setLogicalColumnName( columnName );
                    }
+                   DefaultValue _defaultValue = inferredData.getProperty().getAnnotation(DefaultValue.class);
+                   if (_defaultValue != null) {
+                       String defaultValue = _defaultValue.value();
+                       column.setDefaultValue(defaultValue);
+                   }

                    column.setPropertyName(
                            BinderHelper.getRelativePath( propertyHolder, inferredData.getPropertyName() )
diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
index e57636a..3d871f7 100644
--- a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
+++ b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
@@ -423,6 +424,7 @@ public class Ejb3JoinColumn extends Ejb3Column {
                getMappingColumn() != null ? getMappingColumn().isNullable() : false,
                referencedColumn.getSqlType(),
                getMappingColumn() != null ? getMappingColumn().isUnique() : false,
+               null, // default-value
                false
        );
        linkWithValue( value );
@@ -502,6 +504,7 @@ public class Ejb3JoinColumn extends Ejb3Column {
                getMappingColumn().isNullable(),
                column.getSqlType(),
                getMappingColumn().isUnique(),
+               null, // default-value
                false //We do copy no strategy here
        );
        linkWithValue( value );

ঠিক আছে, এটি হাইবারনেট-একমাত্র সমাধান।


2
আমি ওপেন সোর্স প্রকল্পে সক্রিয়ভাবে অবদান রাখে এমন লোকদের প্রচেষ্টার প্রশংসা করি, তবে আমি এই উত্তরটিকে অগ্রাহ্য করেছি কারণ জেপিএ কোনও ওআর / এম এর উপরে জাভা স্পেসিফিকেশন, ওপি ডিফল্ট মানগুলি নির্দিষ্ট করার জন্য জেপিএ উপায় চেয়েছিল এবং আপনার প্যাচগুলি কাজ করে শুধুমাত্র হাইবারনেটের জন্য। যদি এটি এনহাইবারনেট ছিল, যেখানে দৃ pers়তার জন্য কোনও সুপার- পার্ট স্পেসিফিকেশন নেই (এনপিএ এমনকি এমএস ইএফ দ্বারা সমর্থিত নয়), আমি এই জাতীয় প্যাচকে উত্সাহিত করতাম। সত্যটি হল যে ওপিএমের প্রয়োজনীয়তার তুলনায় জেপিএ যথেষ্ট সীমাবদ্ধ (একটি উদাহরণ: কোনও গৌণ সূচক নয়)। যাইহোক প্রচেষ্টাতে
কুডোস

এটি কি কোনও রক্ষণাবেক্ষণের সমস্যা তৈরি করে না? যখনই হাইবারনেট আপগ্রেড করা হয় বা প্রতিটি তাজা ইনস্টলেশনতে এই পরিবর্তনগুলি আবার করা দরকার?
ব্যবহারকারী 1242321

যেহেতু প্রশ্নটি জেপিএ সম্পর্কিত, এবং হাইবারনেট এমনকি উল্লেখ করা হয়নি, এটি প্রশ্নের উত্তর দেয় না
নীল স্টকটন

5
  1. @Column(columnDefinition='...') ডেটা tingোকানোর সময় আপনি যখন ডাটাবেসে ডিফল্ট সীমাবদ্ধতা সেট করেন তখন কাজ করে না।
  2. আপনাকে টিকা রচনা থেকে তৈরি insertable = falseএবং মুছে ফেলতে columnDefinition='...'হবে, তারপরে ডাটাবেস স্বয়ংক্রিয়ভাবে ডাটাবেস থেকে ডিফল্ট মান সন্নিবেশ করবে।
  3. যেমন আপনি যখন ভারচর লিঙ্গ সেট করেন তখন ডেটাবেজে ডিফল্টরূপে পুরুষ।
  4. আপনাকে কেবল insertable = falseহাইবারনেট / জেপিএ যুক্ত করতে হবে, এটি কার্যকর হবে।


এবং একটি ভাল বিকল্প নয়, যদি আপনি কখনও কখনও এর মান সেট করতে চান।
শিহে ঝাং

@ শিহেজং মিথ্যা ব্যবহার করে আমাকে মান নির্ধারণ করতে দেয় না?
fvildoso

3
@PrePersist
void preInsert() {
    if (this.dateOfConsent == null)
        this.dateOfConsent = LocalDateTime.now();
    if(this.consentExpiry==null)
        this.consentExpiry = this.dateOfConsent.plusMonths(3);
}

আমার ক্ষেত্রে ক্ষেত্রটি লোকালডেটটাইম হওয়ার কারণে আমি এটি ব্যবহার করেছি, এটি বিক্রেতার স্বাধীনতার কারণে প্রস্তাবিত


2

জেপিএ বা হাইবারনেট টীকা উভয়ই কোনও ডিফল্ট কলাম মানকে সমর্থন করে না। এই সীমাবদ্ধতার উপর নির্ভরশীল হিসাবে, আপনি হাইবারনেট save()বা update()সেশনে যাওয়ার আগে সমস্ত ডিফল্ট মান সেট করুন। এটি নিবিড়ভাবে সম্ভব (হাইবারনেট ডিফল্ট মান নির্ধারণের সংক্ষিপ্ত) ডাটাবেসটির আচরণের নকল করে যা কোনও টেবিলে সারি সংরক্ষণ করে যখন ডিফল্ট মান সেট করে।

এই বিকল্প উত্তরের পরামর্শ অনুযায়ী মডেল শ্রেণিতে ডিফল্ট মান নির্ধারণের বিপরীতে , এই পদ্ধতিটিও নিশ্চিত করে যে Exampleঅনুসন্ধানের প্রোটোটাইপ হিসাবে কোনও অবজেক্টকে ব্যবহার করা মানদণ্ডের প্রশ্নগুলি আগের মতো কাজ করা অব্যাহত রাখবে। আপনি যখন কোনও মডেল ক্লাসে একটি নলযোগ্য বৈশিষ্ট্যের (যেটি একটি প্রাক-প্রিমিটিভ টাইপযুক্ত) এর ডিফল্ট মান সেট করেন, তখন হাইবারনেট ক্যোয়ারী-বাই-উদাহরণটি সম্পর্কিত কলামটিকে আর অগ্রাহ্য করবে না যেখানে পূর্বে এটি এটিকে উপেক্ষা করবে কারণ এটি নাল ছিল।


পূর্ববর্তী সমাধানে লেখক কলামডেফল্ট ("")
মেন্টিওনড করেছেন

@ নিকোলাই.সারডিউক যে এই উত্তরটি লেখার কয়েক বছর পরে কলামডেফল্ট টীকা যুক্ত হয়েছিল। ২০১০ সালে এটি সঠিক ছিল, এ জাতীয় কোনও মন্তব্য ছিল না (বাস্তবে কোনও টিকা নেই, কেবলমাত্র এক্সএমএল কনফিগারেশন)।
jwenting

1

জেপিএতে এটি সম্ভব নয়।

কলাম টীকাটি দিয়ে আপনি যা করতে পারেন তা এখানে : http://java.sun.com/javaee/5/docs/api/javax/persistance/ Column.html


1
ডিফল্ট মান নির্দিষ্ট করতে সক্ষম না হওয়া জেপিএ টীকাগুলির একটি গুরুতর ঘাটতি বলে মনে হচ্ছে।
ডেরেক মাহর

2
জেডিও এটির ওআরএম সংজ্ঞায় এটির অনুমতি দেয়, সুতরাং জেপিএকে অবশ্যই এটি অন্তর্ভুক্ত করা উচিত ... একদিন
ইউজার 383680

ক্যামেরন পোপের উত্তর হিসাবে আপনি অবশ্যই কলামডফিনেশন অ্যাট্রিবিউটটি দিয়ে এটি করতে পারেন
ইন্টেলিডিটা

@ ডেরেকমাহার এটি জেপিএর নির্দিষ্টকরণের একমাত্র ঘাটতি নয়। এটি একটি ভাল স্পেসিফিকেশন, তবে এটি নিখুঁত নয়
10.33 তে wুকে পড়ে

1

আপনি যদি একটি ডাবল ব্যবহার করছেন তবে আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

@Column(columnDefinition="double precision default '96'")

private Double grolsh;

হ্যাঁ এটি ডিবি নির্দিষ্ট।


0

আপনি ডাটাবেস ডিজাইনারে ডিফল্ট মান নির্ধারণ করতে পারেন, বা আপনি যখন সারণীটি তৈরি করেন তখন। উদাহরণস্বরূপ এসকিউএল সার্ভারে আপনি একটি তারিখের ডিফল্ট ভল্ট সেট করতে পারেন ( getDate())। insertable=falseআপনার কলাম সংজ্ঞা উল্লিখিত হিসাবে ব্যবহার করুন । জেপিএ সন্নিবেশগুলিতে সেই কলামটি নির্দিষ্ট করে না এবং ডাটাবেস আপনার জন্য মান উত্পন্ন করবে।


-2

আপনাকে করার প্রয়োজন insertable=falseআপনি @Columnটীকা। জেপিএ তখন সেই কলামটিকে উপেক্ষা করবে যখন ডাটাবেসে সন্নিবেশ করানো হবে এবং ডিফল্ট মান ব্যবহৃত হবে।

এই লিঙ্কটি দেখুন: http://mariemjabloun.blogspot.com/2014/03/resolve-set-database-default-value-in.html


2
তারপরে আপনি প্রদত্ত মান @ রুনটাইম কীভাবে প্রবেশ করবেন ??
আশীষ রতন

হ্যাঁ, এটি সত্য। nullable=falseএকটি ব্যর্থ হয়ে যাবে SqlException: Caused by: java.sql.SQLException: Column 'opening_times_created' cannot be null। এখানে আমি "তৈরি" টাইমস্ট্যাম্পটি সেট করতে ভুলে গেছি openingTime.setOpeningCreated(new Date())। এটি ধারাবাহিকতা রাখার একটি দুর্দান্ত উপায় তবে এটি প্রশ্নকারী জিজ্ঞাসা করছে না।
রোল্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.