Org.hibernate.proxy.pojo.javassist.Javassist ক্লাসের জন্য কোনও সিরিয়ালাইজার পাওয়া যায় নি?


95

আমি কাজ করছি SpringMVC, Hibernateএবং JSONতবে আমি এই ত্রুটিটি পাচ্ছি।

HTTP Status 500 - Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) ) 

নীচে আমার সত্তা পরীক্ষা করুন

    @Entity
@Table(name="USERS")
public class User {

    @Id
    @GeneratedValue
    @Column(name="USER_ID")
    private Integer userId;

    @Column(name="USER_FIRST_NAME")
    private String firstName;

    @Column(name="USER_LAST_NAME")
    private String lastName;


    @Column(name="USER_MIDDLE_NAME")
    private String middleName;

    @Column(name="USER_EMAIL_ID")
    private String emailId;

    @Column(name="USER_PHONE_NO")
    private Integer phoneNo;

    @Column(name="USER_PASSWORD")
    private String password;

    @Column(name="USER_CONF_PASSWORD")
    private String  confPassword;

    @Transient
    private String token;

    @Column(name="USER_CREATED_ON")
    private Date createdOn;

    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(name = "USER_ROLES", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
    private List<ActifioRoles> userRole = new ArrayList<ActifioRoles>();


    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy="userDetails")
    @Fetch(value = FetchMode.SUBSELECT)
    private List<com.actifio.domain.Address> userAddress = new ArrayList<com.actifio.domain.Address>();

    @OneToOne(cascade=CascadeType.ALL)
    private Tenant tenantDetails;


    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmailId() {
        return emailId;
    }
    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getConfPassword() {
        return confPassword;
    }
    public void setConfPassword(String confPassword) {
        this.confPassword = confPassword;
    }
    public Date getCreatedOn() {
        return createdOn;
    }
    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }

    public List<ActifioRoles> getUserRole() {
        return userRole;
    }

    public void setUserRole(List<ActifioRoles> userRole) {
        this.userRole = userRole;
    }
    public String getMiddleName() {
        return middleName;
    }
    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }
    public Integer getPhoneNo() {
        return phoneNo;
    }
    public void setPhoneNo(Integer phoneNo) {
        this.phoneNo = phoneNo;
    }

    public List<com.actifio.domain.Address> getUserAddress() {
        return userAddress;
    }
    public void setUserAddress(List<com.actifio.domain.Address> userAddress) {
        this.userAddress = userAddress;
    }
    public Tenant getTenantDetails() {
        return tenantDetails;
    }
    public void setTenantDetails(Tenant tenantDetails) {
        this.tenantDetails = tenantDetails;
    }
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }

    }

আমি কীভাবে এটি সমাধান করতে পারি?


দয়া করে স্ট্যাকট্রেস এবং কোডটি যেখানে ব্যতিক্রম ঘটে
সেগুলি দেখান

আপনার কোডটি কী চেষ্টা করছে সে সম্পর্কে কোনও জ্ঞান না থাকলে, এটি ডিবাগ করা কিছুটা কঠিন তবে আপনি জ্যাকসন এবং হাইবারনেট ব্যবহার করছেন যেহেতু আপনি সম্ভবত github.com/FasterXML/jackson-datatype-hibernate পরীক্ষা করে দেখতে চাইবেন
জিওন্ড এবং

আপনি কি এই শ্রেণি থেকে একটি JSON করার চেষ্টা করছেন? এই ক্ষেত্রে, জেএসওএন সিরিয়ালাইজার সমস্ত বৈশিষ্ট্যগুলি লেখার চেষ্টা করে, আপনার বহু-বহু সম্পর্কের হ্যাশসেটও; এটি একটি অলস ইনিশিয়ালাইজার ব্যতিক্রম করে তোলে
অ্যাঞ্জেলো ইমিডিয়াটা


@ ব্যবহারকারী 2963481 ... দুর্দান্ত এবং খুব সহায়ক প্রশ্ন ব্রো।
মস্তিষ্ক

উত্তর:


197

হাইবারনেট প্রক্সি অবজেক্টের মাধ্যমে অলস লোডিংয়ের সাথে আমার একই সমস্যা ছিল। এর সাথে ক্লাসটি অলসভাবে বোঝা ব্যক্তিগত সম্পত্তি রয়েছে তা টিকিয়ে দিয়ে এটিকে ঘিরে:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

আমি ধরে নিয়েছি যে আপনি আপনার প্রক্সি অবজেক্টের এমন বৈশিষ্ট্যগুলি যুক্ত করতে পারেন যা সেই টীকায় JSON সিরিয়ালাইজেশনটি ভেঙে দেয়।

সমস্যাটি হ'ল সত্ত্বাগুলিগুলি অলসভাবে লোড হয় এবং সিরিয়ালাইজেশন সম্পূর্ণরূপে লোড হওয়ার আগে ঘটে।

Hibernate.initialize(<your getter method>);

4
এটি আমার পক্ষেও কাজ করেছিল ... এই অদ্ভুত আচরণের কোনও ব্যাখ্যা আছে কি?
ভিক্টর

7
@ অঙ্কুর-সিংহলে আপনার জোর দেওয়া উচিত যে এই টিকাটি নেস্টেড ক্লাসে এবং কলিং ক্লাস নয় needed
ডারউইন

4
ইয়াহুও ... এটা কাজ করেছে। আমি কয়েকবার চেষ্টা করেছি এবং কাজ করেছি। আমি কয়েকটি উপায় এবং বুওএম চেষ্টা করেছি। কাজ করছে.
মস্তিষ্ক

4
ধন্যবাদ আমার জন্য কাজ করে। অলস বোঝা মটরশুটিযুক্ত অন্যান্য সত্তাগুলি অ্যাক্সেস করে এমন সংস্থাগুলিতে আপনাকে এই টিকাটি যুক্ত করতে হবে।
শাফকাত শফি

4
আমি মনে করি এটি এই সমস্যার সঠিক সমাধান নয়। যখন আমরা সিরিয়ালাইজ করি, আমরা প্রত্যাশিত হয় সম্পূর্ণ সাবোবজেক্ট, অথবা কমপক্ষে সাব-অবজেক্টের কমপক্ষে প্রাথমিক কী ফলাফলের মধ্যে ফিরে আসবে। এই টীকাগুলি যুক্ত করা কেবল ত্রুটি দমন করবে, তবে আপনাকে পছন্দসই ফলাফল সরবরাহ করবে না।
আনন্দ বৈদ্য 31'19

84

কেবল এটি যুক্ত করতে, আমি এই একই ইস্যুতে দৌড়েছি, তবে সরবরাহিত উত্তরগুলি কার্যকর হয়নি। আমি ব্যতিক্রমের পরামর্শ গ্রহণ করে এবং আবেদন.properties ফাইল যুক্ত করে এটি ঠিক করেছি ...

spring.jackson.serialization.fail-on-empty-beans=false

হাইবারনেট ৪.৩ সহ আমি স্প্রিং বুট v1.3 ব্যবহার করছি

এটি এখন পুরো অবজেক্ট এবং নেস্টেড অবজেক্টকে সিরিয়ালাইজ করে।

সম্পাদনা: 2018

যেহেতু এটি এখনও মন্তব্য পায় আমি এখানে পরিষ্কার করব। এটি একেবারে ত্রুটিটি কেবল আড়াল করে। কর্মক্ষমতা জড়িত আছে। সেই সময়ে, পরে এটি সরবরাহ করার জন্য এবং কাজ করার জন্য আমার কিছু প্রয়োজন ছিল (যা আমি আর বসন্ত ব্যবহার না করেই করেছি)। তাই হ্যাঁ, আপনি যদি সত্যিই সমস্যাটি সমাধান করতে চান তবে অন্য কারও শোনো। আপনি যদি চান এটি এখনই চলে গেছে তবে এগিয়ে যান এবং এই উত্তরটি ব্যবহার করুন। এটি একটি ভয়ানক ধারণা, কিন্তু হেক, আপনার পক্ষে কাজ করতে পারে। রেকর্ডের জন্য, এর পরে আর কখনও ক্র্যাশ বা সমস্যা হয়নি। তবে এটি সম্ভবত এসকিউএল পারফরম্যান্স দুঃস্বপ্ন হয়ে শেষ হয়েছিল।


8
সমস্যাটি সমাধান করে তবে "handler":{},"hibernateLazyInitializer":{}
জসন

দুর্দান্ত! এখানেও ঠিক করা হয়েছে, এটি উত্তর
হিনটোরি

@ ব্যাখ্যাtyvoid- এ অতিরিক্ত সম্পত্তি কেন বিদ্যমান?
রবার্ট মুন

12
@ রবার্টমুন আপনি যদি এগুলি থেকে মুক্তি পেতে চান তবে আপনি নিজের সত্ত্বাকে বর্ননা করতে পারেন@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
সুন্দরভয়েদ

ধন্যবাদ আমি খুঁজে পেলাম যে আরও একটি সমাধান হ'ল ল্যাজি ইজারে পরিবর্তন করা। এটি কোনও পারফরম্যান্সে প্রভাব ফেলবে?
রবার্ট মুন

69

পূর্ববর্তী উত্তরে যেমন সঠিকভাবে পরামর্শ দেওয়া হয়েছে, অলস লোডিংয়ের অর্থ হ'ল আপনি যখন ডাটাবেস থেকে আপনার অবজেক্টটি আনেন তখন নেস্টেড বস্তুগুলি আনা হয় না (এবং প্রয়োজনে পরে আনাও হতে পারে)।

এখন জ্যাকসন নেস্টেড অবজেক্টটি সিরিয়ালিয়াল করার চেষ্টা করেছেন (== এটি থেকে জেএসএন কে তৈরি করুন), তবে ব্যর্থ হয়েছে কারণ এটি সাধারণ বস্তুর পরিবর্তে জাভাসিস্টলজিআইনিটিয়ালাইজারকে খুঁজে পেয়েছে। এটি আপনি দেখছেন ত্রুটি। এখন, কীভাবে এটি সমাধান করবেন?

পূর্বে সিপি 510 দ্বারা প্রস্তাবিত হিসাবে, একটি বিকল্প হ'ল কনফিগারেশনের এই লাইন দ্বারা ত্রুটিটি দমন করা:

spring.jackson.serialization.fail-on-empty-beans=false

তবে এটি লক্ষণগুলি নিয়ে কাজ করছে, কারণটি নয় । এটি মার্জিতভাবে সমাধান করার জন্য, আপনাকে সিদ্ধান্ত নিতে হবে আপনার জেএসএনে এই অবজেক্টটির প্রয়োজন আছে কি না?

  1. আপনার যদি জেএসএনে অবজেক্টের প্রয়োজন হয় FetchType.LAZYতবে ক্ষেত্র থেকে বিকল্পটি সরিয়ে ফেলুন যা এটির কারণ হয় (এটি কেবল কিছু নেস্টেড অবজেক্টের ক্ষেত্রও হতে পারে, কেবল আপনি যে শিকড় সঞ্চার করছেন তা নয়)।

  2. যদি JSON এ অবজেক্টের প্রয়োজন না হয় তবে এই ক্ষেত্রটির (বা ক্ষেত্রটি নিজেই, যদি আপনার যদি আগত মানগুলি গ্রহণ করার প্রয়োজন না হয় তবে) এর সাথে বর্ননা করুন @JsonIgnore, উদাহরণস্বরূপ:

    // this field will not be serialized to/from JSON @JsonIgnore private NestedType secret;

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


16
এটি সেরা উত্তর। সমস্যার মূলটি সম্বোধন করুন, পরবর্তী প্রোগ্রামারকে কেবল তার সাথে মোকাবিলা করার জন্য লক্ষণগুলি মাস্ক করবেন না।
অ্যান্ড্রু

4
আপনি আমার নায়ক.
লেইংস্রোস

ত্রুটির পিছনে কারণটি ব্যাখ্যা করার জন্য এবং দুটি সমাধানের অর্থ প্রদান করার জন্য আপনাকে অনেক ধন্যবাদ
মরিসিও পপ্পে

এর জন্য ধন্যবাদ, তবে আমি দেখতে পাচ্ছি স্প্রিংফক্স-সোয়াগার এখনও আমাকে ত্রুটি দেয়RangeError: Maximum call stack size exceeded
Pra_A

18

আপনি জ্যাকসনের অ্যাড-অন মডিউলটি ব্যবহার করতে পারেন যা হাইবারনেট অলস-লোডিং পরিচালনা করে।

Https://github.com/FasterXML/jackson-datatype-hibernate wich সমর্থন হাইবারনেট 3 এবং 4 পৃথকভাবে আরও তথ্য ।


7
এটি সত্যই সঠিক উত্তর হওয়া উচিত। অন্যান্য সমস্ত উত্তর সমস্যা সমাধানের চেয়ে বাধা দিচ্ছে।
আহমেদ হাসানিয়েন

তবে এই মডিউলটি কীভাবে ব্যবহার করবেন? এর জন্য কোন গাইড আছে?
আনন্দ বৈদ্য

: থেকে কনফিগার জ্যাকসন-ডাটাটাইপ-হাইবারনেট উপায় stackoverflow.com/q/33727017
চেজ

13

আমি মনে করি যে সমস্যাটি আপনি সত্তাটি পুনরুদ্ধার করার উপায়।

হতে পারে আপনি এই জাতীয় কিছু করছেন:

Person p = (Person) session.load(Person.class, new Integer(id));

getপরিবর্তে পদ্ধতিটি ব্যবহার করে দেখুনload

Person p = (Person) session.get(Person.class, new Integer(id));

সমস্যাটি হ'ল লোড পদ্ধতিতে আপনি কেবল প্রক্সি পাবেন তবে আসল বস্তুটি পাবেন না। প্রক্সি অবজেক্টটিতে ইতিমধ্যে লোড হওয়া বৈশিষ্ট্য নেই তাই যখন সিরিয়ালাইজেশন ঘটে তখন সিরিয়ালযুক্ত করার মতো কোনও বৈশিষ্ট্য নেই। আসার পদ্ধতির সাহায্যে আপনি আসলে আসল বস্তুটি পাবেন, এই বস্তুটি আসলে সিরিয়ালযুক্ত হতে পারে।


4
যখন আমি সন্ধানের পরিবর্তে getOne ব্যবহার করি তখন আমার সাথে খুব অনুরূপ ত্রুটি ঘটেছিল। আমার ক্ষেত্রে, আমার ইন্টারফেসের সংগ্রহশালাটি জেপাআরপোসিটোরি বাড়িয়েছিল। কোনও জসন টীকা বা অ্যাপ্লিকেশন
জেমস

জেমস ফ্রেইটাসের মতো, আমি এটিও পেয়েছি যে getOne সমস্যার সমাধান করেছে এবং এর পরিবর্তে ব্যবহার করে উদাহরণস্বরূপ, FindById- অ্যাপ্লিকেশন বৈশিষ্ট্যগুলিতে টীকাগুলি বা উপরের প্রদত্ত লাইনটি ব্যবহার না করেই সমস্যার সমাধান করেছে
আমার

4
আমার কাজের সাথী আমাকে স্পষ্ট করে বলেছিলেন: "মূল পার্থক্যটি হ'ল getOne অলস বোঝা এবং সন্ধান করা হয় না" - এর অর্থ স্পষ্টতই বোঝা যায় যে প্রাক্তন আসলে ডিবি থেকে ডেটা সারি পান না তবে কেবল রেফারেন্স তৈরি করে। পরেরটি, পরিবর্তে প্রকৃতপক্ষে সারি পায়, যা প্রায়শই কাঙ্ক্ষিত
এমওয়াই

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

9

এটা আমার জন্য কাজ করে

@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})

যেমন

@Entity
@Table(name = "user")
@Data
@NoArgsConstructor
@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})
public class User {

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

    private String name;

    private Date created;

}

5

সমস্যাটি সমাধানের দুটি উপায় রয়েছে।

উপায় 1 :

যোগ spring.jackson.serialization.fail-on-empty-beans=falseমধ্যে application.properties

উপায় 2 :

join fetchপ্যারেন্ট অবজেক্ট ডেটা পুনরুদ্ধার করতে JPQL ক্যোয়ারিতে ব্যবহার করুন , নীচে দেখুন:

@Query(value = "select child from Child child join fetch child.parent Parent ",
           countQuery = "select count(*) from Child child join child.parent parent ")
public Page<Parent> findAll(Pageable pageable); 

ধন্যবাদ! প্রথম সমাধানটি দুর্দান্ত!
লুকাস মায়ানো অ্যাঞ্জেলিনী

উপায় 1. দুর্দান্ত। ধন্যবাদ.
লেইংস্রোস

3

হাইবারনেট প্রক্সি অবজেক্টের মাধ্যমে অলস লোডিংয়ের জন্য আমার পক্ষে কাজ করে এমন সত্তা শ্রেণি (মডেল) এ এই টিকা যুক্ত করুন।

টুইটারে


2

এই ব্যতিক্রম

org.springframework.http.converter.httpMessageNotWritableException

পেয়ে যাচ্ছি, আমি আশা করি তাই, আপনার প্রতিক্রিয়া আউটপুট সিরিয়ালাইজেবল অবজেক্ট হিসাবে প্রেরণ করা হচ্ছে।
এটি বসন্তে সংঘটিত সমস্যা। এই সমস্যাটি শেষ করতে, POJO অবজেক্টকে প্রতিক্রিয়া আউটপুট হিসাবে প্রেরণ করুন।

উদাহরণ:

    @Entity
    @Table(name="user_details")
    public class User implements Serializable{

        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY)
        @Column(name="id")
        private Integer id;

        @Column(name="user_name")
        private String userName;

        @Column(name="email_id")
        private String emailId;

        @Column(name="phone_no")
        private String phone;

//setter and getters

পোজো ক্লাস:

public class UserVO {

    private int Id;
    private String userName;
    private String emailId;
    private String phone;
    private Integer active;

//setter and getters

কন্ট্রোলারে সিরিলাইজেবল অবজেক্ট ফিল্ডগুলিকে POJO ক্লাস ফিল্ডে রূপান্তর করুন এবং পোজো শ্রেণিকে আউটপুট হিসাবে ফিরিয়ে দিন।

         User u= userService.getdetials(); // get data from database

        UserVO userVo= new UserVO();  // created pojo class object

        userVo.setId(u.getId());
        userVo.setEmailId(u.getEmailId());
        userVo.setActive(u.getActive());
        userVo.setPhone(u.getPhone());
        userVo.setUserName(u.getUserName());
       retunr userVo;  //finally send pojo object as output.

হ্যাঁ আমিও তাই করছি, তবে একই কাজটি করেও আমি একই ত্রুটি পাচ্ছি, কারণ আমি সম্পর্কিত বিষয়বস্তু প্রেরণ করছি যা সত্তা শ্রেণি স্থাপন ছাড়া কিছুই নয়
Pra_A

2

হাইবারনেট 5.2 এবং উপরে, আপনি নীচের মতো হাইবারনেট প্রক্সিটি সরিয়ে ফেলতে সক্ষম হয়েছেন, এটি আপনাকে আসল বস্তুটি দেবে যাতে আপনি এটি যথাযথভাবে সিরিয়ালায়িত করতে পারেন:

Object unproxiedEntity = Hibernate.unproxy( proxy );

এটি স্বয়ংক্রিয়ভাবে Hibernate.initializeপাশাপাশি আগে কল করবে ।
স্যাম ওয়াইসি

@ টিম, এটি জসন সিরিয়ালাইজেশনের আগে যুক্ত করা উচিত। সমস্যাটি ঘটে কারণ সিরিয়ালাইজেশনের সময় হাইবারনেট প্রক্সি অবজেক্ট পাওয়া গেছে, তাই এটি একবার সরিয়ে ফেললে সিরিয়ালাইজেশন ঠিক হয়ে যাবে। আপনি যদি বসন্ত নিয়ামক ব্যবহার করছেন, তবে আপনাকে নিয়ামক শেষ হওয়ার আগে এটি করতে হবে।
স্যাম ওয়াইসি

1

হাইবারনেটের জন্য আপনি জ্যাকসন-ডেটাটাইপ-হাইবারনেট প্রজেক্টটি অলস-বোঝা বস্তুগুলির সাথে জেএসএন সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন সমন্বিত করতে ব্যবহার করতে পারেন ।

উদাহরণ স্বরূপ,

import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonDatatypeHibernate5Configuration {

    // Register Jackson Hibernate5 Module to handle JSON serialization of lazy-loaded entities
    // Any beans of type com.fasterxml.jackson.databind.Module are automatically
    // registered with the auto-configured Jackson2ObjectMapperBuilder
    // https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
    @Bean
    public Module hibernate5Module() {
        Hibernate5Module hibernate5Module = new Hibernate5Module();
        hibernate5Module.enable( Hibernate5Module.Feature.FORCE_LAZY_LOADING );
        hibernate5Module.disable( Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION );
        return hibernate5Module;
    }
}

আমি যদি এটি ব্যবহার করি তবে আমি পাই can't parse JSON. Raw result:। কোন সাহায্য?
Pra_A

1

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

এখানে সমস্যাটি সাব-অবজেক্টগুলির অলস লোডিং সম্পর্কে, যেখানে জ্যাকসন কেবলমাত্র পূর্ণ প্রস্ফুটিত বস্তুর পরিবর্তে হাইবারনেট প্রক্সিগুলি সন্ধান করে।

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

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

আমি এটি করতে একটি নতুন কনফিগার ক্লাস যুক্ত করেছি।

@Configuration
public class JacksonConfig extends WebMvcConfigurerAdapter {

@Bean
@Primary
public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper mapper = new ObjectMapper();
    Hibernate5Module module = new Hibernate5Module();
    module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING);
    mapper.registerModule(module);
    messageConverter.setObjectMapper(mapper);
    return messageConverter;
}

}

@Primaryনিশ্চিত করে যে অন্য কোনও জিনস আরম্ভের জন্য অন্য কোনও জ্যাকসন কনফিগারেশন ব্যবহার করা হয়নি। @Beanযথারীতি module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING);নির্ভরতাগুলির অলস লোডিং সক্ষম করা।

সাবধানতা - এর কার্যকারিতা প্রভাব জন্য দয়া করে দেখুন। কখনও কখনও EAGER আনতে সহায়তা করে, তবে আপনি যদি এটি আগ্রহী করে তোলেন, আপনার এখনও এই কোডটির প্রয়োজন হবে, কারণ প্রক্সি অবজেক্টগুলি এখনও অন্য সমস্ত ম্যাপিংয়ের জন্য বিদ্যমান রয়েছে@OneToOne

পিএস: একটি সাধারণ মন্তব্য হিসাবে, আমি জসনের প্রতিক্রিয়ায় পুরো ডেটা অবজেক্টটি ফেরত পাঠানোর অনুশীলনকে নিরুৎসাহিত করব, এই যোগাযোগের জন্য ড্টোর ব্যবহার করা উচিত, এবং তাদের মানচিত্রের জন্য ম্যাপস্ট্রাকের মতো কিছু ম্যাপার ব্যবহার করা উচিত। এটি আপনাকে দুর্ঘটনাজনিত সুরক্ষার লফোলগুলি, পাশাপাশি উপরের ব্যতিক্রম থেকে বাঁচায়।


1

আমি এখন একই সমস্যা। আপনি @ jsonIQgnore এর সাথে অলসতায় আনা ঠিক করেছেন কিনা তা পরীক্ষা করে দেখুন

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="teachers")
@JsonIgnoreProperties("course")
Teacher teach;

কেবলমাত্র "(আনুন = ...)" বা টিকা "@ jsonIgnore" মুছুন এবং এটি কার্যকর হবে

@ManyToOne
@JoinColumn(name="teachers")
@JsonIgnoreProperties("course")
Teacher teach;

0

অথবা আপনি মাপারকে এটি হিসাবে কনফিগার করতে পারেন:

অলস লোডিংয়ের জন্য // কাস্টম কনফিগারেশন

public static class HibernateLazyInitializerSerializer extends JsonSerializer<JavassistLazyInitializer> {

    @Override
    public void serialize(JavassistLazyInitializer initializer, JsonGenerator jsonGenerator,
            SerializerProvider serializerProvider)
            throws IOException, JsonProcessingException {
        jsonGenerator.writeNull();
    }
}

এবং ম্যাপার কনফিগার করুন:

    mapper = new JacksonMapper();
    SimpleModule simpleModule = new SimpleModule(
            "SimpleModule", new Version(1,0,0,null)
    );
    simpleModule.addSerializer(
            JavassistLazyInitializer.class,
            new HibernateLazyInitializerSerializer()
    );
    mapper.registerModule(simpleModule);

0

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

<class name="Customer" table="CUSTOMER">
        <id name="custId" type="long">
            <column name="CUSTID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="phone" type="java.lang.String">
            <column name="PHONE" />
        </property>
        <property name="pan" type="java.lang.String">
            <column name="PAN" />
        </property>

        <many-to-one name="customerType" not-null="true" lazy="false"></many-to-one>
    </class>
</hibernate-mapping>

4
আপনার পোস্টে অবহিত করুন যে এটি বাস্তব জীবনের আবেদনে খুব বিপদ সমাধান হতে পারে।
পানুরগ

0

আমি পরিবর্তন করেছি (টিকা মডেল শ্রেণিতে)

ফেচ = ফেচটাইপ.লাজিওয়াই

প্রতি

ফেচ = ফেচটাইপ.এগ্রার

এবং সুন্দর ভাবে কাজ করেছেন ...

ভাল লাগবে।


4
যদিও এটি সমস্যার সমাধান করে এটি খুব বিপজ্জনক। fetchকোনও মডেলটিতে কৌশল পরিবর্তন করা কার্য সম্পাদনে বেশ কয়েকটি পরিণতি অর্জন করে। এই পরিবর্তনটির সাথে আপনি ডাটাবেস থেকে আরও অনেক তথ্য আনছেন। এটি একটি বৈধ সমাধান হতে পারে, তবে প্রথমে একটি পারফরম্যান্স অধ্যয়ন প্রয়োজন।
জোও মেনেইগিন

4
আপনি যদি জানেন যে আপনি মডেল, এবং এর সাথে অনেকগুলি সত্তা সম্পর্কিত নয়, আপনি একটি সম্পূর্ণ সত্ত্বা পাওয়ার জন্য কিছুটা মেম এবং পারফোলেন্স ব্যয় করতে পারেন। তবে জেনে রাখা ভাল যে আপনি সর্বদা সেরা
আলস্য আনেন

0

এটি জ্যাকসনের একটি সমস্যা। এটি প্রতিরোধ করতে, জ্যাকসনকে নেস্টেড সম্পর্ক বা নেস্টেড ক্লাসিকে সিরিয়ালায়িত না করার নির্দেশ দিন।

নিম্নলিখিত উদাহরণটি দেখুন। সিটি , রাজ্য এবং দেশের শ্রেণিতে ম্যাপযুক্ত ঠিকানা শ্রেণি এবং রাজ্য নিজেই দেশ এবং দেশের দিকে ইঙ্গিত করছে অঞ্চলটির দিকে। স্প্রিং বুট REST এপিআইয়ের মাধ্যমে যখন আপনার ঠিকানাগুলির মান পাবেন আপনি উপরের ত্রুটিটি পাবেন। এটা প্রতিরোধ করার জন্য, শুধু ধারাবাহিকভাবে ম্যাপ বর্গ (যা স্তর এক তাদেরকে JSON প্রতিফলিত) এবং সঙ্গে নেস্টেড সম্পর্ক উপেক্ষা , এবং @JsonIgnoreProperties(value = {"state"})@JsonIgnoreProperties(value = {"country"})@JsonIgnoreProperties(value = {"region"})

এটি উপরের ত্রুটি সহ লাজিলোড ব্যতিক্রমকে আটকাবে। উদাহরণ হিসাবে নীচের কোডটি ব্যবহার করুন এবং আপনার মডেল ক্লাসগুলি পরিবর্তন করুন।

ঠিকানা.জভা

@Entity
public class Address extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 4203344613880544060L;

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

    @Column(name = "street_name")
    private String streetName;

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

    @ManyToOne
    @JoinColumn(name = "city_id")
    @JsonIgnoreProperties(value = {"state"})
    private City city;

    @ManyToOne
    @JoinColumn(name = "state_id")
    @JsonIgnoreProperties(value = {"country"})
    private State state;

    @ManyToOne
    @JoinColumn(name = "country_id")
    @JsonIgnoreProperties(value = {"region"})
    private Country country;

    @ManyToOne
    @JoinColumn(name = "region_id")
    private Region region;

    @Column(name = "zip_code")
    private String zipCode;

    @ManyToOne
    @JoinColumn(name = "address_type_id", referencedColumnName = "id")
    private AddressType addressType;

}

সিটি.জভা

@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "city")
@Cache(region = "cityCache",usage = CacheConcurrencyStrategy.READ_WRITE)
@Data
public class City extends AbstractAuditingEntity
{
    private static final long serialVersionUID = -8825045541258851493L;

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

    @Column(name = "name")
    //@Length(max = 100,min = 2)
    private String name;


    @ManyToOne
    @JoinColumn(name = "state_id")
    private State state;
}

রাজ্য.জভা

@Entity
@Table(name = "state")
@Data
@EqualsAndHashCode(callSuper = true)
public class State extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 5553856435782266275L;

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

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

    @Column(name = "name")
    @Length(max = 200, min = 2)
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "country_id")
    private Country country;

}

দেশ.জভা

@Entity
@Table(name = "country")
@Data
@EqualsAndHashCode(callSuper = true)
public class Country extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 6396100319470393108L;

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

    @Column(name = "name")
    @Length(max = 200, min = 2)
    private String name;

    @Column(name = "code")
    @Length(max = 3, min = 2)
    private String code;

    @Column(name = "iso_code")
    @Length(max = 3, min = 2)
    private String isoCode;

    @ManyToOne
    @JoinColumn(name = "region_id")
    private Region region;
}


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