Triển khai một lớp Mã định danh tùy chỉnh; từ một bài đăng trên blog:
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.IdentifierGenerator;
public class StringKeyGenerator implements IdentifierGenerator {
@Override
public Serializable generate(SessionImplementor session, Object collection) throws HibernateException {
Connection connection = session.connection();
PreparedStatement ps = null;
String result = "";
try {
// Oracle-specific code to query a sequence
ps = connection.prepareStatement("SELECT TABLE_SEQ.nextval AS TABLE_PK FROM dual");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
int pk = rs.getInt("TABLE_PK");
// Convert to a String
result = Integer.toString(pk);
}
} catch (SQLException e) {
throw new HibernateException("Unable to generate Primary Key");
} finally {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
throw new HibernateException("Unable to close prepared statement.");
}
}
}
return result;
}
}
Chú thích PK thực thể như sau:
@Id
@GenericGenerator(name="seq_id", strategy="my.package.StringKeyGenerator")
@GeneratedValue(generator="seq_id")
@Column(name = "TABLE_PK", unique = true, nullable = false, length = 20)
public String getId() {
return this.id;
}
Do lỗi trong Eclipse, có thể xảy ra lỗi mà trình tạo (seq_id
) không được xác định trong đơn vị độ bền. Đặt giá trị này thành cảnh báo như sau:
- Chọn Cửa sổ »Tuỳ chọn
- Mở rộng Tính bền của Java »JPA» Lỗi / Cảnh báo
- Nhấp vào Truy vấn và trình tạo
- Đặt Trình tạo không được xác định trong đơn vị duy trì tới:
Warning
- Nhấp vào OK để áp dụng các thay đổi và đóng hộp thoại