2012-11-10 41 views
6

Tôi đang sử dụng Hibernate 3.2.5. Tôi nhận được ngoại lệ trên trong khi sử dụng ánh xạ nhiều người. Bảng đào tạo có mối quan hệ nhiều với một với bảng Vụ, tức là Một Depatement có khả năng thực hiện nhiều hơn một khóa đào tạo.org.hibernate.MappingException: Cột lặp lại trong ánh xạ cho thực thể

Trường hợp ngoại lệ yêu cầu tôi thêm insert="false" update="false" vào tệp hbm của tôi. Nếu tôi thêm bit này vào tệp hbm, thì mã hoạt động tốt.

Dưới đây là file hbm:

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

    <class name="com.infy.model.Training" table="training"> 
    <id name="Id" type="integer" column="ID"> 
     <generator class="assigned"></generator> 
    </id>  
    <property name="trainerName"> 
     <column name="TRAINER_NAME"></column> 
    </property> 
    <property name="deptId"> 
     <column name="DEPT_ID"></column> 
    </property> 
    <property name="trainingSubject"> 
     <column name="TRAINING_SUBJECT"></column> 
    </property> 
    <many-to-one name="departmentDetails" column="DEPT_ID"></many-to-one> 
    </class> 
</hibernate-mapping> 

Nếu tôi thay đổi dòng này để:

<many-to-one name="departmentDetails" column="DEPT_ID" insert="false" update="false"></many-to-one> 

Sau đó, các mã hoạt động. Tôi muốn biết lý do chính xác để thêm điều này là gì.

Kính trọng,

Trả lời

7

Bạn đã ánh xạ cột DEPT_ID hai lần, ở đây:

<property name="deptId"> 
     <column name="DEPT_ID"></column> 
    </property> 

Và ở đây:

<many-to-one name="departmentDetails" column="DEPT_ID"></many-to-one> 

Khi thực hiện một câu lệnh select, Hibernate sẽ ổn thôi Populating hai thuộc tính của đối tượng của bạn so với cùng tuy nhiên, khi thực hiện chèn hoặc cập nhật, nó không thể quyết định thuộc tính nào tồn tại trong cơ sở dữ liệu.

Tại sao bạn cần hai thuộc tính được ánh xạ tới cùng một cột ở địa điểm đầu tiên? Nếu bạn cần truy cập vào deptId, bạn có thể xóa thuộc tính deptId và thay vào đó hãy làm

training.getDepartmentDetails().getId() 
5

Thông báo lỗi cho kịch bản này là khá rõ ràng (bạn đã không đặt nó ở đây, nhưng tôi đã nhìn thấy nó một vài lần). Vấn đề là bạn đã ánh xạ cột DEPT_ID đến hai trường khác nhau trong lớp của bạn.

Trước tiên, bạn đã ánh xạ nó tới thuộc tính deptId và sau đó đến departmentDetails. Khi bạn phát hiện ra, hibernate chỉ cho phép thực hiện điều này nếu một trong các ánh xạ được cấu hình là insert="false" update="false".

Lý do khá đơn giản. Nếu bạn thay đổi deptId thành id khác, hibernate sẽ cần thay đổi lớp được ánh xạ trong departmentDetails, điều này khá phức tạp.

nếu bạn cần lấy deptId, bạn có thể thêm phương thức getDeptId trên Training trả về departmentDetails.getId(). Và không cung cấp setDeptId.

1

Nếu bạn đang sử dụng cùng tên cột hai lần trong tệp ánh xạ của mình. có thể bạn sẽ có được bản đồ Exception

Initial SessionFactory creation failed.org.hibernate.MappingException: 

Ngoài ra nếu u đánh dấu chèn = flase và update = false.

nếu u cố gắng cập nhật hoặc chèn vào các bản ghi trong bảng hoặc hệ thống cũ khác cố gắng cập nhật các giá trị cột này. nó sẽ không cập nhật hoặc chèn vào đó.

Vui lòng kiểm tra liên kết bên dưới. Nó sẽ giúp tìm giải pháp của bạn.

http://www.techienjoy.com/hibernate-insert-update-control.php

Cảm ơn Sandeep G.

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