2012-02-21 33 views
8

Có ngoại lệ bản đồ cho một thực thể cụ thể. Không thể tìm ra từ nơi phát sinh sự cố. Tôi đã kiểm tra tất cả các ánh xạ 3 lần từ đầu đến cuối. Tôi vẫn đang nhận được một ngoại lệ bản đồ.Ngoại lệ lập bản đồ Hibernate: Cột lặp lại trong ánh xạ cho thực thể

Email cho nhân viên chỉ được lập bản đồ một lần. nhưng vẫn còn đó là báo cáo lỗi lặp đi lặp lại bản đồ

Lỗi là:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.cluster.entity.Email column: EMPLOYEE_ID (should be mapped with insert="false" update="false") 
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:680) 
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:702) 
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:724) 
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:477) 
    at org.hibernate.mapping.RootClass.validate(RootClass.java:268) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1287) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1729) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775) 
    at com.cluster.util.HibernateUtil.<clinit>(HibernateUtil.java:16) 
    ... 1 more 

Email POJO

package com.cluster.entity; 

public class Email { 

    private int intEmailID; 
    private String strEmailName; 

    //many to one 
    private EmailType emailType; 

    //many to one 
    private Employee employee; 

    public int getIntEmailID() { 
     return intEmailID; 
    } 

    public void setIntEmailID(int intEmailID) { 
     this.intEmailID = intEmailID; 
    } 

    public String getStrEmailName() { 
     return strEmailName; 
    } 

    public void setStrEmailName(String strEmailName) { 
     this.strEmailName = strEmailName; 
    } 

    public EmailType getEmailType() { 
     return emailType; 
    } 

    public void setEmailType(EmailType emailType) { 
     this.emailType = emailType; 
    } 

    public Employee getEmployee() { 
     return employee; 
    } 

    public void setEmployee(Employee employee) { 
     this.employee = employee; 
    } 

} 

email.hbm.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
     '-//Hibernate/Hibernate Mapping DTD 3.0//EN' 
     'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'> 


<hibernate-mapping package="com.cluster.entity" > 
    <class name="Email" table="EMAIL"> 

     <id name="intEmailID" column="EMAIL_ID"> 
      <generator class="sequence"> 
       <param name="sequence">EMAIL_ID_SEQ</param> 
      </generator> 
     </id> 

     <property name="strEmailName" column = "EMAIL_NAME"/> 

     <many-to-one name="employee" column="EMPLOYEE_ID" not-null = "true" class = "Employee"/> 

     <many-to-one name="emailType" column="EMAIL_TYPE_ID" not-null = "true" class = "EmailType"/> 

    </class> 

</hibernate-mapping> 

liên quan Script

CREATE TABLE EMPLOYEE 
(
    EMPLOYEE_ID  NUMBER      NOT NULL, 
    FIRSTNAME  VARCHAR2(20 BYTE)   NOT NULL, 
    LASTNAME   VARCHAR2(20 BYTE)   NOT NULL, 
    DATE_OF_BIRTH VARCHAR2(20 BYTE)   NOT NULL, 
    SALARY   VARCHAR2(10 BYTE)   NOT NULL, 
    DEPARTMENT_ID NUMBER      NOT NULL 
); 


CREATE TABLE EMAIL 
(
EMAIL_ID    NUMBER    NOT NULL, 
EMAIL_NAME   VARCHAR2(40 BYTE) NOT NULL, 
EMPLOYEE_ID   NUMBER    NOT NULL, 
EMAIL_TYPE_ID   NUMBER    NOT NULL 
); 


CREATE TABLE EMAIL_TYPE 
(
EMAIL_TYPE_ID   NUMBER    NOT NULL, 
EMAIL_TYPE_NAME  VARCHAR2(40 BYTE) NOT NULL 
); 


ALTER TABLE EMPLOYEE ADD 
(
CONSTRAINT PK_EMPLOYEE_ID 
PRIMARY KEY (EMPLOYEE_ID) 
); 

ALTER TABLE EMAIL_TYPE ADD 
(
CONSTRAINT PK_EMAIL_TYPE_ID 
PRIMARY KEY (EMAIL_TYPE_ID) 
); 

ALTER TABLE EMAIL ADD 
(
CONSTRAINT PK_EMAIL_ID 
PRIMARY KEY (EMAIL_ID) 
); 

ALTER TABLE EMAIL ADD 
( 
CONSTRAINT FK_EMAIL_EMPLOYEE_ID 
FOREIGN KEY (EMPLOYEE_ID) 
REFERENCES EMPLOYEE (EMPLOYEE_ID) 
); 

ALTER TABLE EMAIL ADD 
( 
CONSTRAINT FK_EMAIL_EMAIL_TYPE_ID 
FOREIGN KEY (EMAIL_TYPE_ID) 
REFERENCES EMAIL_TYPE (EMAIL_TYPE_ID) 
); 

Email cho nhân viên được ánh xạ một lần duy nhất. nhưng vẫn đang báo cáo lỗi lặp lại ánh xạ

Trả lời

9

bạn có đặt bộ sưu tập trong Nhân viên là nghịch đảo không?

<bag name="emails" inverse="true"> 
    <key column="EMPLOYEE_ID" not-null="true"> 
    ... 
</bag> 
+0

có! .... lỗi được giải quyết! tại sao chúng ta nên làm nghịch đảo = true ?? có nghĩa là gì ??? – bali208

+3

nghịch đảo có nghĩa là Trẻ em (Email) chịu trách nhiệm về liên kết. vì vậy, con là chủ sở hữu của 'EMPLOYEE_ID' và phải chèn/cập nhật nó. cha mẹ chỉ sử dụng trường để knwo con của nó, nhưng không chèn/cập nhật nó – Firo

+0

Tương tự, tôi đã có '@ JoinColumn' ở cả hai mặt của mối quan hệ hai chiều của tôi. Tuy nhiên, thông báo lỗi mơ hồ đó đã gửi cho tôi một cuộc săn đuổi ngỗng hoang dã vừa kết thúc ở đây. – HDave

1

Tôi nghĩ bạn đã lập bản đồ Nhân viên gửi email bằng mối quan hệ oneToMany. Nếu có gì mình sai nhưng bạn phải chắc chắn rằng bạn có thể chèn và cập nhật chỉ theo một hướng

nên được ánh xạ với chèn = "false" cập nhật = "false" trong nhân viên

+0

có ... bạn đã đúng! tôi đã thử nó .. chúng ta nên làm nghịch đảo = "true", hoặc làm như bạn đã nói! – bali208

5

Đối với những người đang sử dụng chú thích để giải quyết vấn đề này, các lớp học sẽ trông giống như sau:

@Entity 
public class Email { 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE) 
    private int intEmailID; 

    @Column(insertable = false, updatable = false) 
    private int employeeId; 

    @ManyToOne 
    private EmailType emailType; 

    @ManyToOne 
    @JoinColumn(name="employeeId") 
    private Employee employee; 

    // Getters and Setter 
} 


@Entity 
public class Employee { 

    @Id 
    private int id; 

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy="employeeId") 
    @PrimaryKeyJoinColumn 
    private List<Email> emailList; 

    public void setEmailList(List<Email> emailList) { 
     this.emailList = emailList 
    } 

    public List<Email> getEmailList() { 
     return emailList; 
    } 

    // Rest of getters and setters 

} 
Các vấn đề liên quan