特定のエンティティにはマッピングの例外があります。問題が発生している場所を把握することはできません。すべてのマッピングを最初から最後まで3回チェックしました。それでもマッピング例外が発生します。
従業員への電子メールは一度だけマップされます。しかし、それでもマッピングの繰り返しエラーを報告しています
エラーは次のとおりです。
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
Eメール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>
関連スクリプト
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)
);
従業員への電子メールは一度だけマップされます。しかし、それでもマッピングの繰り返しエラーを報告しています
employeeのコレクションを逆に設定しましたか?
<bag name="emails" inverse="true">
<key column="EMPLOYEE_ID" not-null="true">
...
</bag>
これを解決するためにアノテーションを使用している人にとって、クラスは次のようになります。
@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
}
OneToManyリレーションを使用してEmployee
をEmail
にマッピングしたと思います。はいの場合は何も問題はありませんが、一方向にのみ挿入および更新できることを確認する必要があります
Employee
のinsert="false" update="false"
でマップする必要があります