org.hibernate. ম্যাপিংএক্সেপশন: java.util.List এর তালিকা নির্ধারণ করা যায়নি, টেবিলে: কলেজ, কলামের জন্য: [org.hibernate.mapping. Column (শিক্ষার্থী)]


97

আমি আমার প্রকল্পের সমস্ত সিআরইউডি অপারেশনের জন্য হাইবারনেট ব্যবহার করছি। এটি ওয়ান-টু-ম্যান এবং বহু-এক-এক সম্পর্কের জন্য কাজ করে না। এটি আমাকে নীচের ত্রুটি দেয়।

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: College, for columns: [org.hibernate.mapping.Column(students)]

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

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: College, for columns: [org.hibernate.mapping.Column(students)]

আমি ইন্টারনেটে কিছু অনুসন্ধান চালিয়েছি , সেখানে কেউ এটি হাইবারনেটে একটি বাগ বলছে , এবং কেউ বলেছেন, @ জেনারেটেডভ্যালু যুক্ত করে এই ত্রুটিটি সাফ হয়ে যাবে, তবে এটি আমার কাজ করে না।

কলেজ.জভা

@Entity
public class College {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int collegeId;
private String collegeName;


private List<Student> students;

@OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER)
public List<Student> getStudents() {
    return students;
}
public void setStudents(List<Student> students) {
    this.students = students;
}//Other gettters & setters omitted

ছাত্র.জভা

@Entity
public class Student {


@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int studentId;
private String studentName;


private College college;

@ManyToOne
@JoinColumn(name="collegeId")
public College getCollege() {
    return college;
}
public void setCollege(College college) {
    this.college = college;
}//Other gettters & setters omitted

মাইন.জভা:

public class Main {

private static org.hibernate.SessionFactory sessionFactory;

  public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
      initSessionFactory();
    }
    return sessionFactory;
  }

  private static synchronized void initSessionFactory() {
    sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

  }

  public static Session getSession() {
    return getSessionFactory().openSession();
  }

  public static void main (String[] args) {
                Session session = getSession();
        Transaction transaction = session.beginTransaction();
        College college = new College();
        college.setCollegeName("Dr.MCET");

        Student student1 = new Student();
        student1.setStudentName("Peter");

        Student student2 = new Student();
        student2.setStudentName("John");

        student1.setCollege(college);
        student2.setCollege(college);



        session.save(student1);
        session.save(student2);
        transaction.commit();
  }


}

কনসোল:

 Exception in thread "main" org.hibernate.MappingException: Could not determine type  for: java.util.List, at table: College, for columns:  [org.hibernate.mapping.Column(students)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:306)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:290)
at org.hibernate.mapping.Property.isValid(Property.java:217)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:463)
at org.hibernate.mapping.RootClass.validate(RootClass.java:235)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1330)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1833)
at test.hibernate.Main.initSessionFactory(Main.java:22)
at test.hibernate.Main.getSessionFactory(Main.java:16)
at test.hibernate.Main.getSession(Main.java:27)
at test.hibernate.Main.main(Main.java:43)

এক্সএমএল:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/dummy</property>
    <property name="connection.username">root</property>
    <property name="connection.password">1234</property>
    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>
    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>
    <!-- Disable the second-level cache -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>
    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">update</property>

    <mapping class="test.hibernate.Student" />
    <mapping class="test.hibernate.College" />
</session-factory>


4
@ সমস্ত: কেউই আমাকে সম্পর্কে বলেনি, মেইন.জাভাতে সম্পূর্ণ কোড বিভ্রান্তি সম্পর্কে :(

সমস্যা তালিকা অবজেক্টের তৈরি হতে পারে
কেমাল দুরান

4
[পরবর্তীতে] আমার বসন্ত বুট অ্যাপ্লিকেশনটিতে, @Access(AccessType.FIELD)(আমার ক্ষেত্রে আমি ফিল্ডের সাথে যেতে চেয়েছিলাম) কেবল এটিই সমাধান করেছিল
স্কারামোচে

উত্তর:


176

আপনি ফিল্ড অ্যাক্সেস কৌশল ব্যবহার করছেন (@ আইড টীকা দ্বারা নির্ধারিত)। জেপিএ সম্পর্কিত যেকোনো এনোটোটেশন গেটারের সম্পত্তি পরিবর্তে প্রতিটি ক্ষেত্রের ঠিক উপরে রাখুন

@OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER)
private List<Student> students;

@ আর্থার রোনাল্ড এফডি গার্সিয়া: ধন্যবাদ, এটি দুর্দান্ত কাজ করেছে। তবে, প্রোগ্রামটি এখন নতুন করে বন্ধ হয়ে গেছে। object references an unsaved transient instance - save the transient instance before flushingআপনি কি এই ত্রুটি সম্পর্কে সচেতন? না হলে শুধু ছেড়ে দিন। আমি খুজছি.

@ আর্থার রোনাল্ড এফডি গার্সিয়া: হাই, আবার আমি আমার বর্তমান ত্রুটির সমাধান পেয়েছি, যা আমি আমার আগের মন্তব্যে জিজ্ঞাসা করেছি। এই লিঙ্কটি। stackoverflow.com/questions/1667177/… সমাধান সহ অন্তর্ভুক্ত cascade=CascadeType.ALL। তবে আমার জন্য এটি আমার গ্রহনে কোনও ত্রুটি এবং কোনও পরামর্শ দেখায়। ওটা সম্পর্কে কি আপনি কিছু জানেন. :)

10
@ আর্থার +1 ভাল ক্যাচ করুন @ মারাভান আপনি ক্ষেত্রের অ্যাক্সেস কৌশল বা সম্পত্তি অ্যাক্সেস কৌশলটি ব্যবহার করতে পারেন তবে শ্রেণি শ্রেণিবিন্যাসের মধ্যে আপনার সামঞ্জস্য বজায় রাখতে হবে, আপনি কৌশলগুলি মিশ্রণ করতে পারবেন না, অন্তত জেপিএ 1.0 তে নয়। জেপিএ ২.০ যদিও কৌশলগুলি মিশ্রিত করা সম্ভব করে তোলে তবে আপনার অতিরিক্ত টিকা প্রয়োজন (এবং আরও জটিলতা)। সুতরাং সুপারিশটি হ'ল একটি কৌশল বাছাই করা এবং এটি আপনার প্রয়োগে আটকে থাকা। ২.২.২.২ দেখুন অ্যাক্সেস প্রকার
পাস্কাল থিভেন্ট

@ আর্থার রোনাল্ড এফডি গার্সিয়া: হুম মম ... আমি এখন যোগ করেছি persistence.cascadeএটি ক্লিয়ার হয়ে গেছে। তবে আমি আবার পুরানো ত্রুটি object references an unsaved transient instance - save the transient instance before flushingপেয়েছি AnY সাজেশন !!! : + |

@ সমস্ত: কেউই আমাকে সম্পর্কে বলেনি, মেইন.জাভাতে সম্পূর্ণ কোড বিভ্রান্তি সম্পর্কে :(

79

@ElementCollectionতালিকা ক্ষেত্রে যোগ করা এই সমস্যার সমাধান করেছে:

    @Column
    @ElementCollection(targetClass=Integer.class)
    private List<Integer> countries;

4
+ targetClassআপনি তালিকার <Integer>
ধরণটি

4
এটি প্রয়োজনীয় বলে মনে হচ্ছে, কারণ আমি ঠিক এই সমস্যার জন্য একটি সমাধান অনুসন্ধান করছিলাম এবং আমার সহজ স্ট্রিংয়ের তালিকায় @ এলিমেন্টক্লোকশন (টার্গেটক্লাস = স্ট্রিংক্লাস) যুক্ত করে এটি সমাধান করেছি।
অ্যাঞ্জেল ও'স্পিয়ার

33

অ্যাক্সেস কৌশলগুলির সাথে সমস্যা

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

ক্ষেত্র-ভিত্তিক অ্যাক্সেস

ক্ষেত্র-ভিত্তিক অ্যাক্সেস ব্যবহার করার সময়, অন্যান্য সত্তা-স্তরের পদ্ধতি যুক্ত করা আরও বেশি নমনীয় কারণ হাইবারনেট অধ্যবসায় অবস্থার সেই অংশগুলি বিবেচনা করবে না

@Entity
public class Simple {

@Id
private Integer id;

@OneToMany(targetEntity=Student.class, mappedBy="college", 
fetch=FetchType.EAGER)
private List<Student> students;

//getter +setter
}

সম্পত্তি ভিত্তিক অ্যাক্সেস

সম্পত্তি-ভিত্তিক অ্যাক্সেস ব্যবহার করার সময়, হাইবারনেট সত্ত্বার অবস্থা পড়ার এবং লেখার জন্য উভয়ই অ্যাক্সেসরগুলি ব্যবহার করে

@Entity
public class Simple {

private Integer id;
private List<Student> students;

@Id
public Integer getId() {
    return id;
}

public void setId( Integer id ) {
    this.id = id;
}
@OneToMany(targetEntity=Student.class, mappedBy="college", 
fetch=FetchType.EAGER)
public List<Student> getStudents() {
   return students;
}
public void setStudents(List<Student> students) {
    this.students = students;
}

}

তবে আপনি একই সাথে ফিল্ড-ভিত্তিক এবং সম্পত্তি-ভিত্তিক উভয় অ্যাক্সেস ব্যবহার করতে পারবেন না। এটি আপনার জন্য সেই ত্রুটির মতো দেখাবে

আরও ধারণা জন্য এই অনুসরণ করুন


9
@Access(AccessType.PROPERTY)
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="userId")
public User getUser() {
    return user;
}

আমার একই সমস্যা রয়েছে, আমি এটি যুক্ত করে সমাধান করেছি @Access(AccessType.PROPERTY)


আমার বসন্ত বুট অ্যাপ্লিকেশনটিতে, @Access(AccessType.FIELD)(আমার ক্ষেত্রে আমি ফিল্ডের সাথে যেতে চেয়েছিলাম) কেবল এটিই সমাধান করেছিল
স্কারামোচে

2

চিন্তা করবেন না! টীকা দেওয়ার কারণে এই সমস্যা দেখা দেয়। ক্ষেত্র ভিত্তিক অ্যাক্সেসের পরিবর্তে, সম্পত্তি ভিত্তিক অ্যাক্সেস এই সমস্যার সমাধান করে। কোডটি নিম্নরূপ:

package onetomanymapping;

import java.util.List;

import javax.persistence.*;

@Entity
public class College {
private int collegeId;
private String collegeName;
private List<Student> students;

@OneToMany(targetEntity = Student.class, mappedBy = "college", 
    cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public List<Student> getStudents() {
    return students;
}

public void setStudents(List<Student> students) {
    this.students = students;
}

@Id
@GeneratedValue
public int getCollegeId() {
    return collegeId;
}

public void setCollegeId(int collegeId) {
    this.collegeId = collegeId;
}

public String getCollegeName() {
    return collegeName;
}

public void setCollegeName(String collegeName) {
    this.collegeName = collegeName;
}

}


2

নীচে যেমন আপনার অ্যারে তালিকা ভেরিয়েবলের উপরে কেবলমাত্র @ এলিমেটিক্যালেকশন টীকাটি প্রবেশ করান:

@ElementCollection
private List<Price> prices = new ArrayList<Price>();

আশা করি এটা কাজে লাগবে


দারুণ! এটি একটি মোহন মত কাজ! অন্য উত্তরগুলি আমার পক্ষে কাজ করে না। এটি সত্যিই এটি করেছে। মূল উত্তরটি আমাকে আরও সমস্যার মধ্যে ফেলেছে যা আমাকে এগুলির থেকে আলাদা করতে হবে। ভাল উত্তর!
সংকলন v2

1

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

আপনি যখন ভেরিয়েবল এ @ আইডি টিকা দিচ্ছেন তা নিশ্চিত করুন যে অন্যান্য সমস্ত টিকাগুলিও কেবল ভেরিয়েবলের উপর সম্পন্ন হয়েছে এবং আপনি যখন এটি গেটর পদ্ধতিতে টিকিয়ে রাখছেন তখন নিশ্চিত হয়ে নিন যে আপনি কেবলমাত্র অন্যান্য সমস্ত গিটারের পদ্ধতিতে এনারেট করছেন কেবল তাদের সম্পর্কিত ভেরিয়েবলগুলি নয়।


1

যদি আমার সাথে একই সমস্যার মুখোমুখি হয় অন্য কেউ এখানে অবতরণ করে। আমি উপরের মতো একই ত্রুটি পেয়েছিলাম:

Init পদ্ধতির প্রার্থনা ব্যর্থ হয়েছে; নেস্টেড ব্যতিক্রমটি org.hibernate. ম্যাপিংএক্সেপশন: টেবিলের জন্য: java.util. Colલેક્શન এর জন্য টাইপ নির্ধারণ করা যায়নি:

হাইবারনেট কোনও সত্তায় কোন কলামগুলি রয়েছে তা নির্ধারণ করতে প্রতিবিম্বটি ব্যবহার করে। আমার একটি ব্যক্তিগত পদ্ধতি ছিল যা 'get' দিয়ে শুরু হয়েছিল এবং এমন একটি বস্তু ফেরত পাঠিয়েছিল যা একটি হাইবারনেট সত্তা। এমনকি হাইবারনেট যে আপনি অগ্রাহ্য করতে চান তা বেসরকারী প্রাপ্তরাও @ ট্রান্সিয়েন্টের মাধ্যমে টীকায়িত হতে হবে। একবার আমি @ ট্রান্সিয়েন্ট টীকা যুক্ত করে সমস্ত কিছু কাজ করে।

@Transient 
private List<AHibernateEntity> getHibernateEntities() {
   ....
}

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