Tôi đang làm việc trên một cơ sở mã kế thừa với một lược đồ DB hiện có. Mã hiện có sử dụng SQL và PL/SQL để thực hiện các truy vấn trên DB. Chúng tôi đã được giao nhiệm vụ thực hiện một phần nhỏ của dự án cơ sở dữ liệu động cơ bất khả tri (lúc đầu, thay đổi mọi thứ cuối cùng). Chúng tôi đã chọn sử dụng các tệp ánh xạ Hibernate 3.3.2.GA và "* .hbm.xml" (trái ngược với chú thích). Thật không may, không thể thay đổi lược đồ hiện tại vì chúng tôi không thể phục hồi bất kỳ tính năng cũ nào.Làm cách nào để có thể ánh xạ "insert = 'false' update = 'false'" trên thuộc tính khóa-id hỗn hợp cũng được sử dụng trong FK một-nhiều?
Vấn đề tôi đang gặp phải là khi tôi cố gắng lập bản đồ một mối quan hệ một chiều, một chiều, trong đó FK là cũng là một phần của PK tổng hợp. Dưới đây là các lớp và tập tin bản đồ ...
CompanyEntity.java
public class CompanyEntity {
private Integer id;
private Set<CompanyNameEntity> names;
...
}
CompanyNameEntity.java
public class CompanyNameEntity implements Serializable {
private Integer id;
private String languageId;
private String name;
...
}
CompanyNameEntity.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="com.example.CompanyEntity" table="COMPANY">
<id name="id" column="COMPANY_ID"/>
<set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
<key column="COMPANY_ID"/>
<one-to-many entity-name="vendorName"/>
</set>
</class>
<class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
<composite-id>
<key-property name="id" column="COMPANY_ID"/>
<key-property name="languageId" column="LANGUAGE_ID"/>
</composite-id>
<property name="name" column="NAME" length="255"/>
</class>
</hibernate-mapping>
Mã này chỉ hoạt động tốt cho SELECT và INSERT của một công ty có tên. Tôi gặp phải sự cố khi tôi cố gắng cập nhật và ghi lại hiện có. Tôi nhận được một BatchUpdateException và sau khi xem xét thông qua các bản ghi SQL Tôi thấy Hibernate đã cố gắng làm điều gì đó ngu ngốc ...
update COMPANY_NAME set COMPANY_ID=null where COMPANY_ID=?
Hibernate đã cố gắng để dis-sư hồ sơ con trước khi cập nhật chúng. Vấn đề là trường này là một phần của PK và không có giá trị. Tôi tìm thấy giải pháp nhanh chóng để làm cho Hibernate không làm điều này là thêm "not-null = 'true'" vào phần tử "key" trong ánh xạ chính. lập bản đồ SO bây giờ có thể trông như thế này ...
CompanyNameEntity.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="com.example.CompanyEntity" table="COMPANY">
<id name="id" column="COMPANY_ID"/>
<set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
<key column="COMPANY_ID" not-null="true"/>
<one-to-many entity-name="vendorName"/>
</set>
</class>
<class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
<composite-id>
<key-property name="id" column="COMPANY_ID"/>
<key-property name="languageId" column="LANGUAGE_ID"/>
</composite-id>
<property name="name" column="NAME" length="255"/>
</class>
</hibernate-mapping>
lập bản đồ này cung cấp cho các ngoại lệ ...
org.hibernate.MappingException: Repeated column in mapping for entity: companyName column: COMPANY_ID (should be mapped with insert="false" update="false")
Vấn đề của tôi bây giờ là tôi đã tryed thêm các thuộc tính này vào phần tử thuộc tính khóa nhưng không được DTD hỗ trợ. Tôi cũng đã cố gắng thay đổi nó thành một yếu tố chính-nhiều-một nhưng nó cũng không hoạt động. Vì vậy ...
Làm cách nào để có thể ánh xạ "insert = 'false' update = 'false'" trên thuộc tính khóa-id tổng hợp cũng được sử dụng trong FK một-nhiều?
Sau khi xem xét các chú thích Hibernate doc, có vẻ như tôi có thể có thể tạo ra các bản đồ mong muốn với các chú thích JPA/Hibernate. Tôi sẽ thử nghiệm với điều này nhiều hơn một chút và đăng kết quả của tôi. –
Ánh xạ mà tôi đang cố gắng chỉ định là KHÔNG thể sử dụng các tệp * .hbm.xml. Cách duy nhất để thực hiện điều này là sử dụng chú thích như đã đề cập trong câu trả lời của mcyalcin dưới đây. –
Tôi đoán bài đăng này có thể giải quyết được sự cố trong cấu hình XML, http://stackoverflow.com/questions/9381029/hibernate-mapping-exception-repeated-column-in-mapping-for-entity –