2012-02-21 18 views
8

Istnieje wyjątek odwzorowania dla określonej jednostki. Dowiedz się, skąd bierze się problem. Sprawdziłem wszystkie mapowania 3 razy od początku do końca. Nadal dostaję wyjątek odwzorowania.Wyjątek mapowania hibernacji: powtarzana kolumna w odwzorowaniu dla jednostki

E-mail do pracownika jest mapowany tylko raz. ale nadal jest zgłoszenie błędu powtarzana mapping

błąd jest:

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> 

pokrewne 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 do pracownika jest odwzorowany tylko raz. ale nadal zgłasza błąd powtarzania mapowania

Odpowiedz

9

ustawiłeś kolekcję w Employee jako odwrotnie?

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

tak! .... błąd rozwiązany! dlaczego powinniśmy robić odwrotność = prawda? co to znaczy ??? – bali208

+3

odwrotność oznacza, że ​​Dziecko (e-mail) jest odpowiedzialne za powiązanie. więc dziecko jest właścicielem 'EMPLOYEE_ID' i musi wstawić/zaktualizować. rodzic tylko używa pola do knwo jego dzieci, ale go nie wstawia/aktualizuje – Firo

+0

Podobnie miałem '@ JoinColumn' po obu stronach mojego dwukierunkowego związku. Jednak ten niejednoznaczny komunikat o błędzie wysłał mnie na pościg, który właśnie się skończył. – HDave

1

Wydaje mi się, że zmapowałeś pracownika do wiadomości e-mail, używając relacji jedenosobisty. Jeśli tak, to nic złego, ale trzeba się upewnić, można wstawiać i aktualizować tylko w jednym kierunku

powinien być odwzorowany z wkładką = „false” update = „false” w Employee

+0

tak ... masz rację! Próbowałem go .. powinniśmy zrobić odwrotnie = "true", lub zrobić, jak powiedziałeś! – bali208

5

Dla tych, którzy są przy użyciu adnotacji Aby rozwiązać ten problem, klasy powinny wyglądać tak:

@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 

} 
Powiązane problemy