হাইবারনেট ক্ষেত্রে আমি কীভাবে একটি ডিফল্ট মান সেট করব?
@ColumnDefault
হাইবারনেট ক্ষেত্রে আমি কীভাবে একটি ডিফল্ট মান সেট করব?
@ColumnDefault
উত্তর:
আপনি যদি সত্যিকারের ডাটাবেস ডিফল্ট মান চান তবে ব্যবহার করুন columnDefinition
:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
লক্ষ্য করুন যে স্ট্রিংটি columnDefinition
ডাটাবেস নির্ভর। এছাড়াও আপনি যদি এই বিকল্পটি চয়ন করেন তবে আপনাকে ব্যবহার করতে হবে dynamic-insert
, সুতরাং সন্নিবেশে মান Hibernate
সহ কলামগুলি অন্তর্ভুক্ত করবে না null
। অন্যথায় ডিফল্ট সম্পর্কে কথা বলা অপ্রাসঙ্গিক।
তবে আপনি যদি ডাটাবেস ডিফল্ট মান না চান তবে কেবল আপনার জাভা কোডের একটি ডিফল্ট মান চান, কেবল আপনার ভেরিয়েবলটিকে আরম্ভ করুন - private Integer myColumn = 100;
org.hibernate.annotations.Entity
হ্রাস করা হয়েছে। @DynamicInsert
পরিবর্তে টীকাটি ব্যবহার করা উচিত।
আপনি @PrePersist
অ্যানোটেশন ব্যবহার করতে পারেন এবং প্রাক-স্থির পর্যায়ে ডিফল্ট মান সেট করতে পারেন ।
এরকম কিছু:
//... some code
private String myProperty;
//... some code
@PrePersist
public void prePersist() {
if(myProperty == null) //We set default value in case if the value is not set yet.
myProperty = "Default value";
}
// property methods
@Column(nullable = false) //restricting Null value on database level.
public String getMyProperty() {
return myProperty;
}
public void setMyProperty(String myProperty) {
this.myProperty= myProperty;
}
এই পদ্ধতিটি হাইবারনেটের নীচে ডাটাবেস টাইপ / সংস্করণের উপর নির্ভর করে না। ম্যাপিং অবজেক্টটি ধরে রাখার আগে ডিফল্ট মান সেট করা হয়।
setMyProperty
আপনার উদাহরণ দ্বারা ব্যবহার করা হয় না। কেন আপনি এটি অন্তর্ভুক্ত করবেন?
শুধু ক্ষেত্রের জন্য একটি ডিফল্ট মান নির্ধারণ সম্পর্কে কি?
private String _foo = "default";
//property here
public String Foo
যদি তারা কোনও মান পাস করে তবে এটি ওভাররাইট করা হবে, অন্যথায়, আপনার ডিফল্ট রয়েছে।
হাইবারনেট টীকা ব্যবহার করুন
@ColumnDefault("-1")
private Long clientId;
আপনি যদি এটি ডাটাবেসে করতে চান:
ডাটাবেসে ডিফল্ট মান সেট করুন (স্কয়ার সার্ভারের নমুনা):
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
হাইবারনেট ফাইল ম্যাপিং:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
দেখুন, কীটি সন্নিবেশ করা হয়েছে = "মিথ্যা" আপডেট = "মিথ্যা"
একটি সমাধান হ'ল আপনি যাঁর সাথে কাজ করছেন তার মান নাল (বা এর অ-আরম্ভীকৃত অবস্থা যাই হোক না কেন) এবং এটির সমান হলে, আপনার ডিফল্ট মানটি ফিরিয়ে আনুন কিনা তা পরীক্ষা করার জন্য আপনার গেটর পরীক্ষা করা উচিত to
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
আমি এটির জন্য অনুসন্ধান করেছি এবং কলামের জন্য ডিফল্ট মানটির অনেক উত্তর পেয়েছি you আপনি যদি এসকিউএল সারণিতে ডিফল্ট মানটি ব্যবহার করতে চান তবে @ কলাম টীকায় "সন্নিবেশযোগ্য = মিথ্যা" ব্যবহার করুন । ঢোকানো যাবে
@ কলাম (নাম = কলামের নাম, দৈর্ঘ্য = দৈর্ঘ্যফর্ম, সন্নিবেশযোগ্য = মিথ্যা)
আপনি যদি কলামটি ডেফিনিশনটি ব্যবহার করছেন তবে এটি @ কলাম টীকাটি ডায়াগোজন নির্ভর হওয়ায় এটি কাজ করবে না।
ওরাকলের সাথে কাজ করে, আমি এনামের জন্য একটি ডিফল্ট মান সন্নিবেশ করানোর চেষ্টা করছিলাম
আমি সেরাটি কাজ করার জন্য নিম্নলিখিতটি পেয়েছি।
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
আপনি জাভা শ্রেণি নির্মাতা ডিফল্ট মান সেট করতে ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:
public class Entity implements Serializable{
private Double field1
private Integer field2;
private T fieldN;
public Entity(){
this.field1=0.0;
this.field2=0;
...
this.fieldN= <your default value>
}
//Setters and Getters
...
}
সারণীর যে কোনও কলাম থেকে ডিফল্ট মান ব্যবহার করতে। তাহলে আপনাকে অবশ্যই @DynamicInsert
সত্য হিসাবে সংজ্ঞায়িত করতে হবে অন্যথায় আপনি কেবল সংজ্ঞা দেবেন @DynamicInsert
। কারণ হাইবারনেট ডিফল্টরূপে সত্য হিসাবে গ্রহণ করে। প্রদত্ত উদাহরণ হিসাবে বিবেচনা করুন:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
আপনি যদি কোনও ডিফল্ট সত্তা সম্পত্তি মান সেট করতে চান তবে আপনি ডিফল্ট মানটি ব্যবহার করে সত্তা ক্ষেত্রটি আরম্ভ করতে পারেন।
উদাহরণস্বরূপ, আপনি createdOn
বর্তমান সময়ের জন্য ডিফল্ট সত্তা বৈশিষ্ট্যটি সেট করতে পারেন :
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
আপনি যদি হাইবারনেট দিয়ে ডিডিএল স্কিমা তৈরি করে থাকেন তবে এটি প্রস্তাবিত নয়, আপনি columnDefinition
জেপিএ টীকাটির বৈশিষ্ট্যটি ব্যবহার করতে পারেন , এটির @Column
মতো:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Generated
টীকা প্রয়োজন হয় কারণ আমরা হাইবারনেট নির্দেশ সত্তা পর অধ্যবসায় কনটেক্সট রাঙা কি না, অন্যথা, ডাটাবেজ তৈরি হওয়া মান ইন-মেমোরি সত্তা রাষ্ট্রের সঙ্গে সিঙ্ক্রোনাইজ হবে না রিলোড করতে চাই।
এর পরিবর্তে columnDefinition
ফ্লাইওয়ের মতো একটি সরঞ্জাম ব্যবহার করে আপনি ডিডিএল বর্ধিত মাইগ্রেশন স্ক্রিপ্টগুলি ব্যবহার করা ভাল। এইভাবে, আপনি DEFAULT
জেপিএ টীকা পরিবর্তে এসকিউএল ধারাটি স্ক্রিপ্টে সেট করবেন ।
ব্যবহার সম্পর্কে আরও বিস্তারিত জানার জন্য
@Generated
টীকা, খুঁজে বার করো এই নিবন্ধটি ।
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
আমি হাইবারনেট 5 এবং পোস্টগ্রিসের সাথে কাজ করছি এবং এটি আমার গঠন করেছে।
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
আপনি যদি ডাটাবেসের ক্ষেত্রে ডিফল্ট মান সেট করতে চান তবে ঠিক সেট করুন @Column( columnDefinition = "int default 1")
তবে আপনি যা চান তা যদি আপনার জাভা অ্যাপ্লিকেশনটিতে একটি ডিফল্ট মান সেট করা হয় তবে আপনি এটি আপনার শ্রেণির বৈশিষ্ট্যে এটি সেট করতে পারেন: private Integer attribute = 1;
উপরের পরামর্শটি কার্যকর হয়, তবে কেবলমাত্র টিকাটি যদি গেটর পদ্ধতিতে ব্যবহৃত হয়। সদস্য যেখানে ঘোষণা করা হয় সেখানে টীকাগুলি ব্যবহার করা থাকলে কিছুই হবে না।
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}