স্প্রিং বুট + জেপিএ: কলাম নাম টীকাটি উপেক্ষা করা হয়েছে


121

নির্ভরতা সহ আমার একটি স্প্রিং বুট অ্যাপ্লিকেশন রয়েছে spring-boot-starter-data-jpa। আমার সত্তা শ্রেণীর একটি কলামের নাম সহ কলাম টীকা রয়েছে। উদাহরণ স্বরূপ:

@Column(name="TestName")
private String testName;

এটি দ্বারা উত্পাদিত এসকিউএল test_nameকলামের নাম হিসাবে তৈরি । সমাধান অনুসন্ধান করার পরে আমি খুঁজে পেয়েছি যে সমস্যার spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategyসমাধান হয়েছে (কলামের টীকা টীকা টিকা থেকে নেওয়া হয়েছে)।

তবুও, আমার প্রশ্ন হ'ল জেপিএ'র নাম উল্লেখ না করে কেন EJB3NamingStrategyকলামের টীকাকে উপেক্ষা করা হচ্ছে? হাইবারনেট ডায়ালেক্ট এর সাথে কিছু করার আছে? আমি এমএস এসকিউএল 2014 এক্সপ্রেসে সংযোগ করছি এবং আমার লগগুলিতে রয়েছে:

Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect 

1
এই প্রশ্নটি স্পষ্টভাবে সরবরাহ করা কলামের নাম উপেক্ষা করার পরিবর্তে পরিবর্তিত হচ্ছে । এটা তোলে নিচে boils এই হচ্ছে প্রত্যাশিত পরিবর্তে মৃত্যুদন্ড কার্যকর স্বচ্ছ বৈকল্পিক । হাইবারনেট প্রকৃতপক্ষে টীকাটিকে উপেক্ষা করতে পারে , উদাহরণস্বরূপ আপনি যখন প্রত্যাশিত অ্যাক্সেসের ধরণের ব্যতীত অন্যগুলি ব্যবহার করেন তবে এখানে এটি হয় না। @Column(name="...")
ভ্লাস্টিমিল ওভেক

উত্তর:


163

হাইবারনেট 5 এর জন্য আমি আমার অ্যাপ্লিকেশন.প্রপার্টি ফাইলগুলিতে পরবর্তী লাইন রেখে এই সমস্যাটি সমাধান করেছি:

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

30
স্প্রিং.জপা.হিবারনেট.নামিং.ফিজিক্যাল-স্ট্র্যাটেজি = org.hibernate.boot.model.naming.PhysicalNamingStrategySenderardImpl, নামটি যেমন আছে তেমন রাখার জন্য কেবল এই সম্পত্তিটির প্রয়োজন।
অভিষেক রিংসিয়া

1
আমার একই সমস্যা ছিল এবং সেই 2 টি সম্পত্তি যুক্ত করা আমার জন্য এটি সমাধান করেছে। আমি স্প্রিং বুট 1.4.3 চালাচ্ছি
জোহান

1
এটি আমার পক্ষেও একমাত্র সমাধান যা কাজ করেছিল। আমি স্প্রিং বুটটি ব্যবহার করছি 1.4.2
সানজিভ জীবন

আমি স্প্রিং বুট 1.5.9. ব্যবহার করছি, নিখরচায়, এই পোস্টটি আমার জন্য কাজ করে
IcyBrk

দুর্দান্ত ... আমি ভাবছিলাম কেন এটি আমার @ কলাম টীকাটিকে উপেক্ষা করছে। অবশেষে এটি আমাকে সাহায্য করেছিল। আমার কাছে আমার কাছে মনে হচ্ছে এটি কোনও বাগ বা অনুপস্থিত কার্যকারিতা।
রাজু পেনুমতসা

86

ডিফল্টরূপে বসন্ত org.springframework.boot.orm.jpa.SpringNamingStrategyটেবিলের নাম উত্পন্ন করতে ব্যবহার করে। এটি একটি খুব পাতলা এক্সটেনশন org.hibernate.cfg.ImprovedNamingStrategy। এই tableNameশ্রেণীর পদ্ধতিটি একটি উত্স Stringমান পাস করেছে তবে এটি কোনও @Column.nameঅ্যাট্রিবিউট থেকে আসে কিনা বা ক্ষেত্রের নাম থেকে স্পষ্টতই উত্পন্ন হয়েছে তা অজানা ।

সারণী নামটি অপরিবর্তিত হিসাবে কেবল যেখানে ব্যবহার করে সেখানে ImprovedNamingStrategyরূপান্তর CamelCaseকরা হবে ।SNAKE_CASEEJB3NamingStrategy

আপনি যদি নামকরণের কৌশলটি পরিবর্তন করতে না চান তবে আপনি সর্বদা আপনার কলামের নাম ছোট হাতের অক্ষরে উল্লেখ করতে পারেন:

@Column(name="testname")

1
হাই, ফিল স্প্রিং বুট ব্যবহার করে, আমি স্প্রিং.জপা.ইবারনেট.নেমিং.স্ট্রেট্যাগী: org.hibernate.cfg.EJB3 নামকরণ স্ট্র্যাগি যুক্ত করেছি। তবে দেখে মনে হচ্ছে এটি আমার পক্ষে কাজ করবে না। আপনি কি আমাকে সাহায্য করতে পারেন?
BeNOisy

প্রতিক্রিয়াটির গুরুত্বপূর্ণ অংশটি হ'ল নামটি ছোট ক্ষেত্রে রাখা! আমি রাষ্ট্রের পরিবর্তন না করার জন্য পরামর্শ দিচ্ছি কিন্তু কলামের নামটি সংবেদনশীল না হওয়ায় নামটি ছোট অক্ষরে রাখা উচিত!
loicmathieu

31

এটা মনে হচ্ছে যে

@Column (নাম = "..")

না থাকলে সম্পূর্ণ উপেক্ষা করা হয়

spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.EJB3NamingStrategy

নির্দিষ্ট, তাই আমার কাছে এটি একটি বাগ।

@ কলাম (নাম = "..") কেন উপেক্ষা করা হয়েছে তা জানার চেষ্টা করতে কয়েক ঘন্টা সময় কাটিয়েছি।


4
আমারও একই সমস্যা ছিল। আমি এখানে একটি ইস্যু রিপোর্ট যুক্ত করেছি: github.com/spring-projects/spring-boot/issues/2129
Kacper86

অনেক ধন্যবাদ. আমার অ্যাপটি বিদ্যমান ডিবিতে নির্দেশ করতে প্রায় এক দিন হারিয়েছে।
দিমিত্রি ইরখিন

এটি প্রকৃতপক্ষে উপেক্ষা করা হয়নি, কেবলমাত্র ডিফল্ট স্প্রিং নামকরণ কৌশলটি প্রদত্ত নামের বৈশিষ্ট্যে প্রয়োগ করা হয়। @ ফিলিওয়েব উত্তরটি পড়ুন
মিশেল

15

এর জন্য ডিফল্ট কৌশল @Column(name="TestName")হবে test_name, এটি সঠিক আচরণ!

TestNameআপনার ডাটাবেসে নামযুক্ত কলাম থাকলে আপনার কলাম টীকাতে পরিবর্তন করা উচিত @Column(name="testname")

এই কাজ কারণ ডাটাবেসের গ্রাহ্য না করে যদি আপনি আপনার কলাম TestName বা testname নাম ( কলাম নামে কেস অবশ হয় !! )।

তবে সাবধান, একই ডাটাবেসের নাম এবং টেবিলের নামগুলির ক্ষেত্রে প্রযোজ্য না যা ইউনিক্স সিস্টেমে সংবেদনশীল তবে উইন্ডোজ সিস্টেমে সংবেদনশীল (এটি সম্ভবত অনেক লোককে রাতে জাগিয়ে রেখেছে, উইন্ডোতে কাজ করছে তবে লিনাক্স স্থাপন করছে) :))


3
১. প্রকৃতপক্ষে এটি সত্য নয়, কলামের নামগুলি আপনি যে ডেটাবেসটি ব্যবহার করছেন তার কনফিগারেশনের উপর নির্ভর করে সংবেদনশীল হতে পারে ... ২. @ কলামের নাম - নাম অনুসারে ডাটাবেস কলামের নাম সরবরাহ করার জায়গা হওয়া উচিত, কোনও সনাক্তকারী নয় রানটাইম চলাকালীন পরিবর্তিত হবে ..
কামিল

1. ধন্যবাদ, আপনি কি ডিবি উদাহরণ দিতে পারবেন যেখানে কলামের নামগুলি ডিফল্টরূপে সংবেদনশীল? : 2. বাস্তবিক @column আমাদের যৌক্তিক নাম যে PhysicalNamingStrategy শারীরিক নামের মীমাংসা করা হয় দেয়, অন্তত যে কি ডক বলেছেন মনে করা হয় docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/...
Orhan

2
1. দুঃখিত, আমি ডিফল্টরূপে কোনটি এটির যত্নশীল তা হিসাবে আমি পারি না, আমি ডিবিএ দ্বারা যেটি সেটিংস ব্যবহার করছি তার উপরে যত্নশীল। ২. এটি দুর্ভাগ্যজনকভাবে সত্য - এটি কেবল আমার ব্যক্তিগত মতামতটি ভুল যেহেতু এটি আমাকে ভাবতে বাধ্য করে বা কীভাবে নামটি কলামে ম্যাপ করা হবে তা সম্পর্কে, অথবা কোন নামকরণের কৌশলটি যা ব্যবহারের নামগুলিকে স্পর্শ করে না।
কামিল

1
সত্য, এটি সর্বাধিক স্বজ্ঞাত সমাধান হবে এবং এ সম্পর্কে আরও ভাল ডকুমেন্টেশন ক্ষতি করবে না।
অরহান

সুস্পষ্টভাবে সেট করা কলামের নামটি সমস্ত অবস্থার অধীনে একটি স্পষ্টভাবে উত্পন্ন একটিকে ওভাররাইড করা উচিত। যদি তা না হয় তবে এটি জেপিএ বাস্তবায়নের ক্ষেত্রে একটি বাগ।

13

আমার জন্য কেবলমাত্র সমাধানটিই কাজ করেছিল উপরের টিটআর্গ দ্বারা পোস্ট করা। আমি স্প্রিং বুটে 1.4.2 ডাব্লু / হাইবারনেট 5. যথা

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

অতিরিক্ত অন্তর্দৃষ্টির জন্য আমি কল ট্রেস পোস্ট করছি যাতে স্প্রিং কী নাম দেয় তার স্পষ্ট নামকরণের কৌশলটি সেটআপ করতে হাইবারনেটে রূপান্তরিত করে।

      at org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl.toPhysicalColumnName(PhysicalNamingStrategyStandardImpl.java:46)
  at org.hibernate.cfg.Ejb3Column.redefineColumnName(Ejb3Column.java:309)
  at org.hibernate.cfg.Ejb3Column.initMappingColumn(Ejb3Column.java:234)
  at org.hibernate.cfg.Ejb3Column.bind(Ejb3Column.java:206)
  at org.hibernate.cfg.Ejb3DiscriminatorColumn.buildDiscriminatorColumn(Ejb3DiscriminatorColumn.java:82)
  at org.hibernate.cfg.AnnotationBinder.processSingleTableDiscriminatorProperties(AnnotationBinder.java:797)
  at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:561)
  at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:245)
  at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222)
  at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265)
  at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847)
  at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874)
  at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
  at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
  at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373)
  at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
  at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
  - locked <0x1687> (a java.util.concurrent.ConcurrentHashMap)
  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
  at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081)
  at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856)
  at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
  - locked <0x1688> (a java.lang.Object)
  at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)
  at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)
  at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)

6

teteArg , আপনাকে অনেক ধন্যবাদ। কেবলমাত্র একটি যুক্ত তথ্য, এই প্রশ্নের মধ্যে যে সমস্ত লোক ঝাঁপিয়ে পড়েছে তারা কেন তা বুঝতে সক্ষম হবে।

কি teteArg বলেন স্প্রিং বুট প্রচলিত প্রোপার্টি নির্দেশিত হয়: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

স্পষ্টতই, বসন্ত.জেপা.হাইবারনেট.নামিং.স্ট্রেটগি হাইবারনেট 5 ব্যবহার করে স্প্রিং জেপিএ প্রয়োগের জন্য সমর্থিত সম্পত্তি নয়।


আমি আপনাকে সাহায্য করে খুশি
teteArg

4

দেখা যাচ্ছে যে আমাকে কেবলমাত্র @columnটেস্টনামকে সমস্ত ছোট অক্ষরে রূপান্তর করতে হবে, যেহেতু এটি প্রাথমিকভাবে উটের ক্ষেত্রে ছিল।

যদিও আমি সরকারী উত্তরটি ব্যবহার করতে সক্ষম হইনি, তবে প্রশ্নটি আমাকে কী তদন্ত করতে হবে তা জানিয়ে আমার সমস্যা সমাধানে সহায়তা করতে সক্ষম হয়েছিল।

পরিবর্তন:

@Column(name="testName")
private String testName;

প্রতি:

@Column(name="testname")
private String testName;

3

যদি আপনি @ কলাম (...) ব্যবহার করতে চান তবে আপনার আসল ডিবি কলামটি উটের ক্ষেত্রে থাকলেও সর্বদা ছোট-ছোট অক্ষরগুলি ব্যবহার করুন।

উদাহরণ: যদি আপনার আসল ডিবি কলামের নাম হয় TestNameতবে ব্যবহার করুন:

  @Column(name="testname") //all small-case

যদি আপনি এটি পছন্দ করেন না, তবে কেবল আসল ডিবি কলামের নামটি টেস্ট_নামে পরিবর্তন করুন


1

আমার ক্ষেত্রে, টীকাগুলি ক্ষেত্রের পরিবর্তে (কোনও উত্তরাধিকারের অ্যাপ্লিকেশন থেকে পোর্ট করা) পরিবর্তক () পদ্ধতিতে ছিল।

স্প্রিং এই ক্ষেত্রে টীকাটিকেও উপেক্ষা করে তবে অভিযোগ করে না। সমাধানটি ছিল গেটারের পরিবর্তে মাঠে নিয়ে যাওয়া।


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