সত্তা ত্রুটির জন্য ম্যাপিংয়ে আর একটি পুনরাবৃত্তি কলাম


110

অন্যদের সমস্ত পোস্ট করা সত্ত্বেও, ম্যাকোসএক্স, নেটবিএন .2.২ এ গ্লাসফিশের সাহায্যে আমি এই ত্রুটির কোনও সমাধান খুঁজে পাচ্ছি না।

Here the error :
SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer
prepare method
SEVERE: Exception while preparing the app
SEVERE: [PersistenceUnit: supmarket] Unable to build EntityManagerFactory

...

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity:
com.supmarket.entity.Sale column: customerId
(should be mapped with insert="false" update="false")

এখানে কোড:

Sale.java

@Entity
public class Sale {

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

    @Column(nullable=false)
    private Long idFromAgency;

    private float amountSold;

    private String agency;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date createdate;

    @Column(nullable=false)
    private Long productId;

    @Column(nullable=false)
    private Long customerId;

    @ManyToOne(optional=false)
    @JoinColumn(name="productId",referencedColumnName="id_product")
    private Product product;

    @ManyToOne(optional=false)
    @JoinColumn(name="customerId",referencedColumnName="id_customer")
    private Customer customer;


    public void Sale(){}    
    public void Sale(Long idFromAgency, float amountSold, String agency
            , Date createDate, Long productId, Long customerId){        
        ...
    }

    // then getters/setters
}

Customer.java

@Entity
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id_customer")
    private Long id_customer;

    @Column(nullable=false)
    private Long idFromAgency;

    private String  gender,
                    maritalState,
                    firstname,
                    lastname,
                    incomeLevel;

    @OneToMany(mappedBy="customer",targetEntity=Sale.class, fetch=FetchType.EAGER)
    private Collection sales;


    public void Customer(){}

    public void Customer(Long idFromAgency, String gender, String maritalState,
            String firstname, String lastname, String incomeLevel) {
        ...
    }

}

Product.java

public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id_product")
    private Long id_product;

    @Column(nullable=false)
    private Long idFromAgency;

    private String name;

    @OneToMany(mappedBy="product",targetEntity=Sale.class, fetch=FetchType.EAGER)
    private Collection sales;

    //constructors + getters +setters
}

উত্তর:


129

বার্তাটি পরিষ্কার: আপনার ম্যাপিংয়ে একটি পুনরাবৃত্তি কলাম রয়েছে। এর অর্থ আপনি একই ডাটাবেস কলামটি দু'বার ম্যাপ করেছেন। এবং প্রকৃতপক্ষে, আপনার আছে:

@Column(nullable=false)
private Long customerId;

এবং যদিও:

@ManyToOne(optional=false)
@JoinColumn(name="customerId",referencedColumnName="id_customer")
private Customer customer;

(এবং একই জন্য productId/ product)।

আপনি অন্যান্য আইডি দ্বারা তাদের আইডি দ্বারা রেফারেন্স না করা উচিত, কিন্তু সত্তা সরাসরি রেফারেন্স দ্বারা। customerIdক্ষেত্রটি সরান , এটি অকেজো। এবং একই জন্য productId। আপনি যদি কোনও বিক্রয়ের গ্রাহক আইডি চান, আপনার কেবল এটি করতে হবে:

sale.getCustomer().getId()

1
আমি একই ত্রুটি পাই তবে আমার পরিস্থিতি কিছুটা আলাদা is আমার সত্তা একই ধরণের এক বা একাধিক সত্তার জনক হতে পারে। বাচ্চাদের বাবার আইডিতে একটি রেফারেন্স পাশাপাশি তাদের নিজস্ব একটি অনন্য আইডি রয়েছে। আমি কীভাবে এ জাতীয় একটি বিজ্ঞপ্তি নির্ভরতা সমাধান করতে পারি?
সিরি

@ জেবিনিজেট তাহলে আমি কীভাবে কোনও বিশেষের সাথে একটি বিক্রয় সঞ্চয় করতে পারি customerId? (যেমন জেএসএন থেকে)।
মিখাইল ব্যাটার

2
Customer customer = entityManager.getReference(customerId, Customer.class); sale.setCustomer(customer);
জেবি নিজত

5
ক্লাসের অন্য একটি ক্ষেত্রের @EmbeddedIdমধ্যে আপনার একটি সমন্বিত কী রয়েছে এমন কেসটি আপনি কীভাবে পরিচালনা করবেন ? এই ক্ষেত্রে আমার ম্যাপিংয়ে উভয় পুনরাবৃত্তি কলামের প্রয়োজন, আমি ঠিক আছি? customerIdCustomer
লুইস আমোরোস

2
@louisamoros হ্যাঁ, আপনি এটা পুনরাবৃত্তি, কিন্তু আপনি যোগ @MapsId("customerId"), দেখুন stackoverflow.com/questions/16775055/hibernate-embeddedid-join
Dalibor Filus

71

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

@ManyToOne(optional=false)
@JoinColumn(name="productId",referencedColumnName="id_product", insertable=false, updatable=false)
private Product product;

@ManyToOne(optional=false)
@JoinColumn(name="customerId",referencedColumnName="id_customer", insertable=false, updatable=false)
private Customer customer;

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


1
ধন্যবাদ, ManyToOneম্যাপিংয়ের ক্ষেত্রের পাশাপাশি এটির সঠিক সমাধানটি আমার প্রয়োজন, যোগদানের কলামে সরাসরি ম্যাপ করা ক্ষেত্র আমার দরকার।
ryenus

আপনার সঠিক ক্ষেত্রটি যখন একই সাথে কী এবং প্রাথমিক কীটি foreing করছে তখন এটি সঠিক সমাধান।
আন্তুয়ানসফট

হায় খোদা, আপনি হয়ত আমার দিনটি বাঁচিয়ে
রেখেছিলেন

22

এটি ব্যবহার করুন, আমার জন্য কাজ:

@Column(name = "candidate_id", nullable=false)
private Long candidate_id;
@ManyToOne(optional=false)
@JoinColumn(name = "candidate_id", insertable=false, updatable=false)
private Candidate candidate;

ধন্যবাদ, এটি আমার ঠিক ঠিক সমাধানটি প্রয়োজন

এমনকি alচ্ছিক = সত্যের সাথেও কাজ করে।
ওন্ডেজ স্টায়েক

11
@Id
@Column(name = "COLUMN_NAME", nullable = false)
public Long getId() {
    return id;
}

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = SomeCustomEntity.class)
@JoinColumn(name = "COLUMN_NAME", referencedColumnName = "COLUMN_NAME", nullable = false, updatable = false, insertable = false)
@org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL)
public List<SomeCustomEntity> getAbschreibareAustattungen() {
    return abschreibareAustattungen;
}

আপনি যদি ইতিমধ্যে একটি কলাম ম্যাপ করে থাকেন এবং দুর্ঘটনাক্রমে @ জয়নকালাম হাইবারনেটে নাম এবং রেফারেন্সযুক্ত কলাম নামটির জন্য একই মান সেট করে থাকেন তবে একই বোকা ত্রুটি দেয়

ত্রুটি:

এর দ্বারা সৃষ্ট: org.hibernate.MappingException: সত্তার জন্য ম্যাপিংয়ে পুনরাবৃত্তি কলাম: com.testtest.SomeCustomEntity কলাম: COLUMN_NAME (সন্নিবেশ = "মিথ্যা" আপডেট = "মিথ্যা" দিয়ে ম্যাপ করা উচিত)


2
আমার জন্য এখানে একটি মূল বিষয়টি ছিল যে ত্রুটিটি "সন্নিবেশ = মিথ্যা আপডেট = মিথ্যা" দিয়ে ম্যাপ করা উচিত তবে প্রকৃত পরামিতি / পদ্ধতিগুলি "সন্নিবেশযোগ্য = মিথ্যা, আপডেটযোগ্য = মিথ্যা" হওয়া উচিত।
নাইট আউল

1

আশা করি এটি সাহায্য করবে!

@OneToOne(optional = false)
    @JoinColumn(name = "department_id", insertable = false, updatable = false)
    @JsonManagedReference
    private Department department;

@JsonIgnore
    public Department getDepartment() {
        return department;
    }

@OneToOne(mappedBy = "department")
private Designation designation;

@JsonIgnore
    public Designation getDesignation() {
        return designation;
    }

0

যে কোনও বৈশিষ্ট্যের জন্য কেবলমাত্র 1 টি সেটার এবং গেটর সরবরাহ করার জন্য যত্ন নিন। কাছে যাওয়ার সর্বোত্তম উপায় হ'ল ম্যানুয়ালি সম্পাদনা করার পরিবর্তে গ্রহস্ব জেনারেট সেটার এবং গেটর ইউটিলিটি ব্যবহার করে সমস্ত বৈশিষ্ট্যের সংজ্ঞা লিখুন। বিকল্পটি ডান ক্লিকে আসে -> উত্স -> জেটর এবং সেটার উত্পন্ন করে।


0

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

    @Column(name = "column1")
    private String object1;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "column1", referencedColumnName = "column1")
    private TableClass object2;

উপরের কোড স্নিপেটে সমস্যা হ'ল আমরা ম্যাপিং পুনরাবৃত্তি করছি ...

সমাধান

যেহেতু ম্যাপিং একটি গুরুত্বপূর্ণ অঙ্গ, আপনি এটি মুছে ফেলতে চান না। পরিবর্তে, আপনি সরান হবে

    @Column(name = "column1")
    private String uniqueId;

আপনি এখনও টেবিলক্লাসের একটি অবজেক্ট তৈরি করে অবজেক্ট 1 এর মানটি পাস করতে পারেন এবং এতে অবজেক্ট 1 এর স্ট্রিং মান নির্ধারণ করতে পারেন।

এটি 100% কাজ করে। আমি পোস্টগ্রিস এবং ওরাকল ডাটাবেস দিয়ে এটি পরীক্ষা করেছি।


0

আমরা গ্রেইল 4 (জিওআরএম) এ প্যারেন্ট সত্তার পরিবর্তে সন্তানের সত্তাকে ম্যাপিং দিয়ে বিজ্ঞপ্তি নির্ভরতা (পিতামাতাই শিশু সত্তা) সমাধান করেছি।

উদাহরণ:

Class Person {
    String name
}

Class Employee extends Person{
    String empId
}

//Before my code 
Class Address {
    static belongsTo = [person: Person]
}

//We changed our Address class to:
Class Address {
    static belongsTo = [person: Employee]
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.