Ngoại lệ 'id cho lớp này phải được gán theo cách thủ công trước khi gọi save ()' có nghĩa là bạn đang sử dụng chiến lược tạo mã định danh của 'Được chỉ định'.
đã chỉ định cho phép ứng dụng gán một mã định danh cho đối tượng trước khi lệnh save () được gọi. Đây là chiến lược mặc định nếu không có phần tử nào được chỉ định.
Nếu bạn không xác định bất kỳ chiến lược nào, chế độ ngủ đông mặc định là 'được chỉ định'. chiến lược 'được chỉ định' ngụ ý rằng hibernate mong đợi rằng ứng dụng cung cấp id riêng của nó.
Nếu bạn muốn sử dụng trình tạo id trình tự trong Oracle, bạn có thể làm như vậy với cấu hình sau -
Nếu bạn đang sử dụng xml -
<id name="countryId" type="java.lang.Integer">
<column name="Country_Id" />
<generator class="sequence">
<param name="sequence">Country_Id_Seq</param>
</generator>
</id>
Nếu bạn đang sử dụng chú thích -
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Country_Id_Seq")
@SequenceGenerator(name="Country_Id_Seq", sequenceName="Country_Id_Seq" )
private Integer sequence;
Và mã của bạn sẽ giống như vậy -
Country c=new Country();
c.setCountryName(request.getParameter("txtCountryName"));
c.setCountryCode(request.getParameter("txtCountryCode"));
Zone z=(Zone) session.get(Zone.class, new BigDecimal(request.getParameter("zoneId")));
c.setZone(z);
session.save(c);
session.flush();
System.out.println(c.getCountryId());
Khi 'session.save (c)' thực thi, hibernate thực hiện lệnh gọi sql sau đây tới Oracle, truy xuất id và đặt nó trong đối tượng Country.
select Country_Id_Seq.nextVal from dual;
Sự cố với trình kích hoạt
Vì bạn đang sử dụng trình kích hoạt để tăng id khi một hàng được chèn vào, điều này sẽ gây ra sự cố với trình tự ngủ đông. Hibernate đang sử dụng trình tự để tạo id và cơ sở dữ liệu đang sử dụng trình kích hoạt để tăng id. Điều này dẫn đến việc id được tăng lên hai lần.
Bạn có ba tùy chọn để giải quyết vấn đề này.
-
Xóa trình kích hoạt vì nó không cần thiết.
-
Nếu bạn vẫn cần trình kích hoạt vì bảng có thể được cập nhật bên ngoài ứng dụng, bạn có thể cập nhật trình kích hoạt sao cho id chỉ được tạo nếu id không được đặt trong câu lệnh chèn P>
-
Tạo trình tạo id tùy chỉnh sử dụng trình kích hoạt để đặt id trong dữ liệu trước khi được lưu vào db. Kiểm tra liên kết sau - https://forum.hibernate.org/viewtopic.php?t=973262