হাইবারনেট দিয়ে কীভাবে কোনও ডিফল্ট সত্তা সম্পত্তি মান সেট করতে হয়


145

হাইবারনেট ক্ষেত্রে আমি কীভাবে একটি ডিফল্ট মান সেট করব?


3
আপনি কি এক্সএমএল কনফিগারেশন ফাইল বা টীকা ব্যবহার করছেন?
ব্রুনো

2
উত্তর নিচে শুধুমাত্র JPA সমাধান যা সঠিক দিতে, কিন্তু একটি হাইবারনেট সমাধান .for দেখতে stackoverflow.com/questions/28107554/... আপনি ব্যবহার করতে হবে@ColumnDefault
pdem

উত্তর:


185

আপনি যদি সত্যিকারের ডাটাবেস ডিফল্ট মান চান তবে ব্যবহার করুন columnDefinition:

@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100") 

লক্ষ্য করুন যে স্ট্রিংটি columnDefinitionডাটাবেস নির্ভর। এছাড়াও আপনি যদি এই বিকল্পটি চয়ন করেন তবে আপনাকে ব্যবহার করতে হবে dynamic-insert, সুতরাং সন্নিবেশে মান Hibernateসহ কলামগুলি অন্তর্ভুক্ত করবে না null। অন্যথায় ডিফল্ট সম্পর্কে কথা বলা অপ্রাসঙ্গিক।

তবে আপনি যদি ডাটাবেস ডিফল্ট মান না চান তবে কেবল আপনার জাভা কোডের একটি ডিফল্ট মান চান, কেবল আপনার ভেরিয়েবলটিকে আরম্ভ করুন - private Integer myColumn = 100;


6
টীকা সহ: @ org.hibernate.annotations.Entity (গতিশীলInsert = সত্য)
হোমাস্তো

9
বর্তমানে org.hibernate.annotations.Entityহ্রাস করা হয়েছে। @DynamicInsertপরিবর্তে টীকাটি ব্যবহার করা উচিত।
জান্নি

1
আমি এই পরিস্থিতির জন্য কলাম সংজ্ঞা ব্যবহারের পরামর্শ দেব না, এটি একটি ডাটাবেস থেকে অন্যটিতে বহনযোগ্য নয় এবং আপনার সার্ভারের নির্দিষ্ট এসকিউএল ভাষা জানা দরকার।
পিডিএম

@ ডায়নামিকআইনসর্ট ডেটাবেস পোজো ক্লাসে যুক্ত করা দরকার।
রিয়াজ মোর্শেদ

3
আমি কলামডেফিন্টির পরিবর্তে @ কলামডেফোল্ট ব্যবহার করার পরামর্শ দেব কারণ এটি আরও বেশি ডাটাবেস স্বাধীন ডক্স sjboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
জালশ

35

আপনি @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আপনার উদাহরণ দ্বারা ব্যবহার করা হয় না। কেন আপনি এটি অন্তর্ভুক্ত করবেন?
এন্ডারম্যানএপিএম

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

30

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

private String _foo = "default";

//property here
public String Foo

যদি তারা কোনও মান পাস করে তবে এটি ওভাররাইট করা হবে, অন্যথায়, আপনার ডিফল্ট রয়েছে।


8
@ মিমখালি: কোনও ডিফল্ট মানের ভূমিকা মান আপডেট করা থেকে বিরত রাখছে না, তাই না?
জানুস লেনার

27

হাইবারনেট টীকা ব্যবহার করুন

@ColumnDefault("-1")
private Long clientId;

আপনাকে ধন্যবাদ, এটি কাজ করে। তবে আমাকে টেবিলটি আবার তৈরি করতে হয়েছিল।
ইয়ামাসিরো

1
এটি হ'ল আসল সমাধান হওয়া উচিত, বর্তমান উত্তর দ্বারা প্রস্তাবিত কলামডিফাইনিশন ব্যবহার করা একটি হিটল এবং আপনাকে প্রকারটি অন্তর্ভুক্ত করতে হবে। আমার মতামত অনুসারে @ কলমডেফল্ট টিকাটি আরও সহজ।
জুডোস

7

আপনি যদি এটি ডাটাবেসে করতে চান:

ডাটাবেসে ডিফল্ট মান সেট করুন (স্কয়ার সার্ভারের নমুনা):

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"  />
    ...

দেখুন, কীটি সন্নিবেশ করা হয়েছে = "মিথ্যা" আপডেট = "মিথ্যা"


ওরাকল-এর জন্য একটি সমস্যা রয়েছে: সম্পত্তিটি যদি শূন্য না হয় তবে এর মানটি ডিফল্ট মানটি দিয়ে রাখে। আসল মান নয়।
অল্প বয়স্ক

5

একটি সমাধান হ'ল আপনি যাঁর সাথে কাজ করছেন তার মান নাল (বা এর অ-আরম্ভীকৃত অবস্থা যাই হোক না কেন) এবং এটির সমান হলে, আপনার ডিফল্ট মানটি ফিরিয়ে আনুন কিনা তা পরীক্ষা করার জন্য আপনার গেটর পরীক্ষা করা উচিত to

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}

আমি এমন একটি ম্যাপার ব্যবহার করছি যা আমার সত্তা অবজেক্টটিতে সেটারকে কল করে। আপনার কোড স্নিপেটটি গ্রাহক এবং সেটার উভয়কেই ব্যবহার করার কোনও প্রতিকূলতা রয়েছে?
এরিক ফ্রান্সিস

4

আমি এটির জন্য অনুসন্ধান করেছি এবং কলামের জন্য ডিফল্ট মানটির অনেক উত্তর পেয়েছি you আপনি যদি এসকিউএল সারণিতে ডিফল্ট মানটি ব্যবহার করতে চান তবে @ কলাম টীকায় "সন্নিবেশযোগ্য = মিথ্যা" ব্যবহার করুন । ঢোকানো যাবে

@ কলাম (নাম = কলামের নাম, দৈর্ঘ্য = দৈর্ঘ্যফর্ম, সন্নিবেশযোগ্য = মিথ্যা)

আপনি যদি কলামটি ডেফিনিশনটি ব্যবহার করছেন তবে এটি @ কলাম টীকাটি ডায়াগোজন নির্ভর হওয়ায় এটি কাজ করবে না।


এটি "তৈরিআট" এর মতো কলামগুলির জন্য দুর্দান্ত কাজ করে যেখানে আপনি সর্বদা ডিবি ডিফল্ট ব্যবহার করতে চান। ধন্যবাদ!
মিশাল ফিলিপ

4

@ColumnDefault()টীকাটি ব্যবহার করুন । এটি কেবল হাইবারনেট।


2

ওরাকলের সাথে কাজ করে, আমি এনামের জন্য একটি ডিফল্ট মান সন্নিবেশ করানোর চেষ্টা করছিলাম

আমি সেরাটি কাজ করার জন্য নিম্নলিখিতটি পেয়েছি।

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;

2

আপনি জাভা শ্রেণি নির্মাতা ডিফল্ট মান সেট করতে ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

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
...

}

2

সারণীর যে কোনও কলাম থেকে ডিফল্ট মান ব্যবহার করতে। তাহলে আপনাকে অবশ্যই @DynamicInsertসত্য হিসাবে সংজ্ঞায়িত করতে হবে অন্যথায় আপনি কেবল সংজ্ঞা দেবেন @DynamicInsert। কারণ হাইবারনেট ডিফল্টরূপে সত্য হিসাবে গ্রহণ করে। প্রদত্ত উদাহরণ হিসাবে বিবেচনা করুন:

@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {

    @Column(name = "status", columnDefinition = "int default 100")
    private Long status;

}

2

ডিফল্ট সত্তার সম্পত্তি মান

আপনি যদি কোনও ডিফল্ট সত্তা সম্পত্তি মান সেট করতে চান তবে আপনি ডিফল্ট মানটি ব্যবহার করে সত্তা ক্ষেত্রটি আরম্ভ করতে পারেন।

উদাহরণস্বরূপ, আপনি 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টীকা, খুঁজে বার করো এই নিবন্ধটি



1

আমি হাইবারনেট 5 এবং পোস্টগ্রিসের সাথে কাজ করছি এবং এটি আমার গঠন করেছে।

@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;

0

আপনি যদি ডাটাবেসের ক্ষেত্রে ডিফল্ট মান সেট করতে চান তবে ঠিক সেট করুন @Column( columnDefinition = "int default 1")

তবে আপনি যা চান তা যদি আপনার জাভা অ্যাপ্লিকেশনটিতে একটি ডিফল্ট মান সেট করা হয় তবে আপনি এটি আপনার শ্রেণির বৈশিষ্ট্যে এটি সেট করতে পারেন: private Integer attribute = 1;


-3

উপরের পরামর্শটি কার্যকর হয়, তবে কেবলমাত্র টিকাটি যদি গেটর পদ্ধতিতে ব্যবহৃত হয়। সদস্য যেখানে ঘোষণা করা হয় সেখানে টীকাগুলি ব্যবহার করা থাকলে কিছুই হবে না।

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.