Tôi đã sau "gốc" thực thể (phần ngủ đông cụ thể chú thích):tách các đơn vị JPA từ Hibernate cụ thể tinh chỉnh
@Entity
//@GenericGenerator(name="system-uuid",strategy="org.hibernate.id.UUIDGenerator")
public class Node extends PersistentEntity {
private UUID id;
private String name;
private String displayName;
@Id
@GeneratedValue
//@GeneratedValue(generator="system-uuid") //instead of above line
//@Type(type = "pg-uuid")
public UUID getId() { return id; }
public String getName() { return name; }
public String getDisplayName() { return displayName; }
//stuff omitted
}
này là một phần của một bối cảnh kiên trì triển khai trên JBoss AS 6 (hibernate 3.6) sử dụng PostgreSQL 9 cho cơ sở dữ liệu (sử dụng trình điều khiển JDBC4 mới nhất). PostgreSQL có kiểu cột uuid riêng của nó, yêu cầu một số ánh xạ cụ thể ngủ đông để sử dụng đúng (nhận xét trong mã trên) - nếu không hibernate sẽ cố ánh xạ trường UUID tới BINARY, thì phương ngữ PostgreSQL không hỗ trợ BINARY (rõ ràng là vì postgre có 2 cách để lưu trữ devs và hibernate devs không thích nó) và toàn bộ điều phát nổ.
bỏ ghi chú các dòng ở trên tạo mã hoạt động, nhưng nó buộc tôi phải có thời gian biên dịch phụ thuộc vào chế độ ngủ đông - mà tôi muốn tránh.
cố gắng để thêm một tập tin hbm.xml vào trộn và tham khảo nó từ persistence.xml không kết hợp dữ liệu từ các tập tin và các chú thích, nhưng chỉ đơn giản là bỏ qua các chú thích:
<?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="package">
<class name="Node">
<id name="id" type="pg-uuid">
<generator class="org.hibernate.id.UUIDGenerator"/>
</id>
</class>
</hibernate-mapping>
tôi có thể "làm bù xù "này nộp lên bằng cách thêm thêm 2 thuộc tính, nhưng ngay cả khi tôi làm điều đó (lúc này các công trình lớp Node), thêm bất kỳ thực thể thêm, như:
@Entity
public class Host extends Node {
//fields, getters, fluff
}
tôi nhận được ngoại lệ sau đây:
org.hibernate.DuplicateMappingException: Duplicate class/entity mapping Node
vì hibernate "tìm thấy" Nút hai lần. có cách nào tao nhã quanh đây không? lý tưởng, Node là lớp duy nhất mà tôi sẽ cần các thuộc tính đặc trưng ngủ đông, và nó sẽ là gốc của một hệ thống phân cấp lớn của các lớp. tôi muốn tránh phụ thuộc thời gian biên dịch trên hibernate hoặc lập bản đồ tất cả mọi thứ hoàn toàn trong hbm.xml. cho đầy đủ vì lợi ích, đây là tập tin persistence.xml im sử dụng:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="myPU" transaction-type="JTA">
<jta-data-source>java:/my-postgresql-DS</jta-data-source>
<mapping-file>META-INF/hbm.xml</mapping-file>
<!-- shouldnt need to list classes here since this is deployed -->
<!-- in the same jar as the classes and scanning should work -->
<validation-mode>AUTO</validation-mode>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>
Tôi đã kiểm tra "Java Persistence với JPA" (một JPA 2,0 -book), nhưng nó không nói bất cứ điều gì về UUIDs, vì vậy tôi cho rằng chúng chưa được hỗ trợ bởi JPA. – esaj
chúng được hỗ trợ ít nhất theo nghĩa là bất kỳ thứ gì có thể tuần tự hóa được hỗ trợ (sẽ chuyển thành dữ liệu nhị phân). nhưng với PostgreSQL + Hibernate bạn sẽ không nhận được ngay cả điều đó ... – radai