Kể từ id
trường đã là duy nhất và tự động tăng lên, bạn không cần id tổng hợp trong trường hợp này để thực thể của bạn có thể trông giống như sau:
@Id
@Column(name = "id")
public long getId() {
return id;
}
@Column(name = "subid")
public int getSubid() {
return subid;
}
Thực thể có thể được tìm nạp bằng id sử dụng trình quản lý thực thể:
entityManager.find(MyEntity.class, entityId);
hoặc bạn có thể tìm nạp thực thể bằng cách sử dụng truy vấn có cả id
và subid
:
MyEntity myEntity = entityManager.createTypeQuery("select me from MyEntity where id = :id and subid = :subid", MyEntity.class)
.setParameter("id", entityId)
.setParameter("subid", entitySubId)
.getSingleResult();
Hibernate cũng có SelectGenerator có thể tìm nạp id từ cột cơ sở dữ liệu, rất hữu ích khi cơ sở dữ liệu tạo id bằng cách sử dụng trình kích hoạt.
Thật không may, nó không hoạt động với id tổng hợp, vì vậy bạn đã viết SelectGenerator
mở rộng của riêng mình hoặc sử dụng một chuỗi duy nhất id_sub_id
cột kết hợp id và id phụ thành một cột VARCHAR duy nhất:
'1-0'
'1-1'
'2-0'
'2-1'
Bạn phải viết một trình kích hoạt cơ sở dữ liệu để cập nhật hai cột bằng cách sử dụng một thủ tục được lưu trữ dành riêng cho cơ sở dữ liệu và tổng hợp hai cột thành một VARCHAR. Sau đó, bạn ánh xạ cột tổng hợp bằng cách sử dụng SelectGenerator
chuẩn vào trường Chuỗi:
@Id
@Column(name = "id_sub_id")
@GeneratedValue( strategy = "trigger" )
@GenericGenerator(
name="trigger", strategy="org.hibernate.id.SelectGenerator",
parameters = {
@Parameter( name="keys", value="id_sub_id" )
}
)
public String getId() {
return id;
}