জেপিএ টীকা সহ এমওয়াইএসকিউএল স্বতঃসংশোধনের ক্ষেত্রটি কীভাবে বেনিফিট করা যায়


106

সোজা বিন্দুতে, সমস্যাটি বস্তু অপারেটরটিকে মাইএসকিউএল ডিবিতে সংরক্ষণ করছে। সংরক্ষণ করার আগে, আমি এই টেবিলটি থেকে নির্বাচন করার চেষ্টা করি এবং এটি কাজ করে, তাই ডিবি সংযোগও।

এখানে আমার অপারেটর অবজেক্টটি রয়েছে:

@Entity
public class Operator{

   @Id
   @GeneratedValue
   private Long id;

   private String username;

   private String password;


   private Integer active;

   //Getters and setters...
}

সংরক্ষণ করতে আমি জেপিএ EntityManagerএর persistপদ্ধতিটি ব্যবহার করি ।

এখানে কিছু লগ আছে:

Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?)
com.mysql.jdbc.JDBC4PreparedStatement@15724a0: insert into Operator (active,password, username, id) values (0, 'pass', 'user', ** NOT SPECIFIED **)

যেভাবে আমি এটি দেখছি, সমস্যাটি স্বয়ংক্রিয় বৃদ্ধির সাথে কনফিগারেশন রয়েছে তবে আমি কোথায় তা বুঝতে পারি না।

আমি এখানে দেখেছি এমন কিছু কৌশল চেষ্টা করে: হাইবারনেট মাইএসকিউএল অটো_সংশোধন প্রাথমিক কী ক্ষেত্রটিকে সম্মান করে না তবে এর কিছুই কার্যকর হয়নি

অন্য কোনও কনফিগারেশন ফাইলের প্রয়োজন হলে আমি সেগুলি সরবরাহ করব।

DDL:

CREATE TABLE `operator` ( 
`id` INT(10) NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(40) NOT NULL,
`last_name` VARCHAR(40) NOT NULL,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`active` INT(1) NOT NULL,
PRIMARY KEY (`id`)
)

আপনি হাইবারনেটের কোন সংস্করণ ব্যবহার করছেন?
স্টিভেন বেনিতেজ

উত্তর:


150

একটি মাইএসকিউএল AUTO_INCREMENTকলাম ব্যবহার করতে , আপনার IDENTITYকৌশলটি ব্যবহার করার কথা :

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

AUTOমাইএসকিউএল ব্যবহার করার সময় আপনি কী পাবেন :

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

যা আসলে সমান

@Id @GeneratedValue
private Long id;

অন্য কথায়, আপনার ম্যাপিংয়ের কাজ করা উচিত। তবে হাইবারনেটের idএসকিউএল সন্নিবেশ বিবৃতিতে কলামটি বাদ দেওয়া উচিত , এবং এটি হয় না। কোথাও এক ধরণের অমিল থাকতে হবে।

আপনি কি হাইবারনেট কনফিগারেশনে কোনও মাইএসকিউএল উপভাষা নির্দিষ্ট করেছেন (সম্ভবত MySQL5InnoDBDialectবা MySQL5Dialectআপনি যে ইঞ্জিনটি ব্যবহার করছেন তার উপর নির্ভর করে)?

এছাড়াও, টেবিলটি কে তৈরি করেছে? আপনি কি সংশ্লিষ্ট ডিডিএল দেখাতে পারবেন?

ফলোআপ: আমি আপনার সমস্যার পুনরুত্পাদন করতে পারি না। আপনার সত্তার কোড এবং আপনার ডিডিএল ব্যবহার করে হাইবারনেট মাইএসকিউএল সহ নিম্নলিখিত (প্রত্যাশিত) এসকিউএল উত্পন্ন করে:

insert 
into
    Operator
    (active, password, username) 
values
    (?, ?, ?)

মনে রাখবেন যে idকলামটি প্রত্যাশার মতো উপরের বিবৃতি থেকে অনুপস্থিত।

সংক্ষেপে, আপনার কোড, টেবিল সংজ্ঞা এবং উপভাষা সঠিক এবং সুসংগত, এটি কাজ করা উচিত। যদি এটি আপনার পক্ষে না হয়, তবে কিছু সিঙ্কের বাইরে রয়েছে (একটি ক্লিন বিল্ড করুন, বিল্ড ডিরেক্টরিটি ডাবল করুন, ইত্যাদি) বা অন্য কিছু ঠিক ভুল (সন্দেহজনক কোনও কিছুর জন্য লগগুলি পরীক্ষা করুন)।

উপভাষার বিষয়ে, এর মধ্যে বা কেবলমাত্র তফাতটিই পরে ডিডিএল তৈরির সময় টেবিলের সাথে যুক্ত হয়। এক বা অন্যটি ব্যবহার করা উত্পন্ন এসকিউএল পরিবর্তন করে না।MySQL5DialectMySQL5InnoDBDialectENGINE=InnoDB


পাস্কল, আপনি সে সম্পর্কে ঠিক বলেছেন তবে আমার কনফিগারেশনের ফাইলগুলিতে কিছু ঠিক নেই। অন্য কোনও সুগারেশন সম্ভবত, এখন আমি নতুন তথ্য এবং কনফিগার ফাইল রেখেছি?
ট্রিভুনম

9
@ পাসকল - আমি খুঁজে পেয়েছি যে জেপিএ 2 / হাইবারনেট ৪.০.০.সিআরসি / জেবস এএস bit. বিট.লি / ডিটিইউজিএস
জোশুয়া ডেভিস

4
নোট যে মাইএসকিউএল জন্য সত্য । সঙ্গে পোস্টগ্রি আপনি পাবেন না @GeneratedValue(strategy=GenerationType.IDENTITY)যখন আপনি লিখতে @GeneratedValue(strategy=GenerationType.AUTO)এবং @GeneratedValue। তাই সাবধান হন এবং ভার্বোজ হওয়ার চেষ্টা করুন।
সাজ্জাদজি

দ্রষ্টব্য: হাইবারনেট এবং / অথবা মাইএসকিউএল / মারিয়াডিবি জেনারেশন টাইপ এর আরও সাম্প্রতিক সংস্করণ সহ UTআউটো জেনারেশনটাইপ.ট্যাবলে ডিফল্ট হবে। কোনটি আপগ্রেড করার সময় সিঙ্ক সিকোয়েন্সগুলির সাথে বাজে সমস্যা দেখা দিতে পারে।
শে

টেবিলটি পুনরায় তৈরি করতে ভুলবেন না: বসন্ত.jpa.hibernate.ddl-auto = তৈরি করুন। আপডেটের সাথে এটি কাজ করবে না
গ্লাসনোস্ট

38

মাইএসকিউএল ব্যবহার করে, কেবলমাত্র এই পদ্ধতিটিই আমার পক্ষে কাজ করছিল:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

পাস্কেলের উত্তরে অন্য 2 টি পন্থা আমার পক্ষে কাজ করছে না।


হ্যাঁ, আমি আমার প্রশ্ন / উত্তরে এটি উল্লেখ করেছি। stackoverflow.com/questions/39675714/...
ইয়ান Khonski

ধন্যবাদ, এটি আমার জন্য কার্যকর, আমি এবং এর JPAসাথে ব্যবহার করছি । spring-bootMySQL
ওসামা আল বান্না

12

যে কেউ এটি পড়ার জন্য যারা জেপিএ ২.০-এর জন্য এক্লিপস লিঙ্ক ব্যবহার করছে, এখানে জেপিএর তথ্য ধরে রাখতে আমার দুটি টিকাকান ব্যবহার করতে হয়েছিল, যেখানে "মাই সিকোয়েন্স জেনারেটর" আপনি জেনারেটরটিকে যে নাম দিতে চান, সেখানেই "মাইচেমা" নামটির নাম আপনার ডাটাবেসে স্কিমা যাতে সিক্যুয়েন্স অবজেক্ট থাকে এবং ডাটাবেসে সিকোয়েন্স অবজেক্টের নাম "মাইসেক্সেন্স"।

@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="MySequenceGenerator")
@SequenceGenerator(allocationSize=1, schema="myschema",  name="MySequenceGenerator", sequenceName = "mysequence")

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

http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey#Using_Sequence_Objects

এছাড়াও, প্রসঙ্গটি জানাতে, আমরা এখানে ব্যবহার করছি:

জাভা 7 গ্লাসফিশ 3.1 পোস্টগ্র্যাস এসকিউএল 9.1 প্রাইমফ্রিজ 3.2 / জেএসএফ 2.1

এছাড়াও, অলসতার স্বার্থে, আমি নেটবিনে এটি ডিবি থেকে সত্তা তৈরির জন্য উইজার্ডগুলির সাহায্যে তৈরি করেছি, সংস্থাগুলি থেকে নিয়ন্ত্রক এবং সত্তা থেকে জেএসএফ, এবং উইজার্ডগুলি (স্পষ্টত) সিক্যুয়েন্স-ভিত্তিক আইডি কলামগুলি কীভাবে মোকাবেলা করতে জানে না, তাই ans আপনাকে এই টীকাগুলি ম্যানুয়ালি যোগ করতে হবে।


6

অনুগ্রহ করে নিশ্চিত হয়ে নিন যে স্ট্রিংয়ের পরিবর্তে আইডি ডেটাটাইপটি দীর্ঘ

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private String id;

create table VMS_AUDIT_RECORDS (id **varchar(255)** not null auto_increment primary key (id))

যে হতে হবে

create table VMS_AUDIT_RECORDS (id **bigint** not null auto_increment primary key (id))

6

আপনি যদি হাইবারনেট ভি 3 এর সাথে মাইএসকিএল ব্যবহার করেন তবে এটি ব্যবহার করা ঠিক GenerationType.AUTO এটি কারণ অভ্যন্তরীণভাবে এটি ব্যবহার করবে GenerationType.IDENTITY, যা মাইএসকিউএল-এর ক্ষেত্রে সর্বাধিক অনুকূল।

তবে হাইবারনেট ভি 5-তে, এটি পরিবর্তন হয়েছে। GenerationType.AUTOGenerationType.TABLEসন্নিবেশ জন্য অনেক প্রশ্নের উত্পন্ন যা ব্যবহার করবে ।

আপনি এড়াতে পারবেন GenerationType.IDENTITY(যদি মাইএসকিউএল কেবলমাত্র আপনি ব্যবহার করছেন এমন ডেটাবেস) বা এই নোটেশনগুলি সহ (যদি আপনার একাধিক ডাটাবেস থাকে):

@GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
@GenericGenerator(name = "native", strategy = "native")

হ্যাঁ, আপনার স্প্রিং অ্যাপ্লিকেশনটি আপগ্রেড করার সময় কিছু কদর্য রিগ্রেশন ত্রুটির জন্য জটিল কারণ হুডের নীচেও হাইবারনেটকে আপগ্রেড করে।
জেভেন্টিং

1

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

@Id
@Column(name="id",updatable=false,nullable=false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

1

আপনি যেমন ডাটাবেস তৈরির সময় আইডি সংজ্ঞায়িত টাইপ হিসাবে সংজ্ঞায়িত করেছেন, আপনি একই মডেল ক্লাসে একই ধরনের টাইপ ব্যবহার করতে হবে। এবং আপনি যেমন ডাটাবেসে স্বতঃবৃদ্ধির জন্য আইডিটি সংজ্ঞায়িত করেছেন, আপনাকে এনটেশন @ জেনারেটভ্যালুতে 'কৌশল' বৈশিষ্ট্যে 'জেনারেশনটাইপ.আউটো' মানটি দিয়ে মডেল শ্রেণিতে উল্লেখ করতে হবে। তারপরে কোডটি নীচের মতো হয়ে যায়।

@Entity
public class Operator{

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;

  private String username;

  private String password;

  private Integer active;

  //Getters and setters...
}

1

পাস্কেলের জবাব হিসাবে ঠিক একই, আপনার যদি প্রয়োজন হয় তবে .আউটো কোনও কারণে আপনার অ্যাপ্লিকেশন বৈশিষ্ট্যগুলিতে আপনাকে কেবল যুক্ত করতে হবে:

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto = update

0

আপনি সঠিক ডাটাবেসের সাথে সংযুক্ত আছেন কিনা তা পরীক্ষা করতে পারেন। যেহেতু আমি একই সমস্যার মুখোমুখি হয়েছিলাম তবে শেষ পর্যন্ত আমি দেখতে পেলাম যে আমি বিভিন্ন ডাটাবেসের সাথে সংযুক্ত হয়েছি।

সনাক্তকরণ ডিবি 2, মাইএসকিউএল, এমএস এসকিউএল সার্ভার, সিবাস এবং হাইপারসোনিক এসকিউএলে সনাক্তকরণ কলামগুলি সমর্থন করে। ফিরে পাওয়া শনাক্তকারী দীর্ঘ, সংক্ষিপ্ত বা প্রকারের।

আরও তথ্য: http://docs.jboss.org/hibernate/orm/3.5/references/en/html/mapping.html#mapping-declaration-id


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.