Đây là thiết kế khủng khiếp và tôi thực sự không đề xuất nó (bạn chỉ nên tạo một bảng khác) nhưng có thể.
Trước tiên, bạn sẽ cần phải sử dụng thuộc tính byte[]
để giữ phiên bản được sắp xếp theo thứ tự của danh sách những người sẽ được lưu trữ trong BLOB trong cơ sở dữ liệu. Vì vậy, chú thích nó getter với @Lob
(Tôi sẽ làm cho getter và setter private
để không lộ chúng). Sau đó, hiển thị getter "giả" và setter để trả lại hoặc đặt một số List<Person>
từ số byte[]
. Tôi đang sử dụng SerializationUtils
từ Commons Lang trong mẫu dưới đây (cung cấp cho bạn lớp helper riêng nếu bạn không muốn nhập thư viện này) để sắp xếp/deserialize khi đang di chuyển đến/từ số byte[]
. Đừng quên để đánh dấu getter "giả" với @Transcient
hoặc Hibernate sẽ cố gắng tạo ra một lĩnh vực (và thất bại vì nó sẽ không thể xác định loại cho một List
).
@Entity(name = "family")
class Family implements Serializable {
// ...
private byte[] familyMembersAsByteArray;
public Family() {}
@Lob
@Column(name = "members", length = Integer.MAX_VALUE - 1)
private byte[] getFamilyMembersAsByteArray() { // not exposed
return familyMembersAsByteArray;
}
private void setFamilyMembersAsByteArray((byte[] familyMembersAsByteArray() { // not exposed
this.familyMembersAsByteArray = familyMembersAsByteArray;
}
@Transient
public List<Person> getFamilyMembers() {
return (List<Person>) SerializationUtils.deserialize(familyMembersAsByteArray);
}
public void setParticipants(List familyMembers) {
this.familyMembersAsByteArray = SerializationUtils.serialize((Serializable) familyMembers);
}
}
Đừng quên để làm cho Person
lớp Serializable
và để thêm một thực serialVersionUID
(Tôi chỉ thấy một mặc định ở đây):
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
// ...
private String firstName, lastName;
private int age;
}
Nhưng, hãy để tôi nhấn mạnh, đây là một thiết kế khủng khiếp và nó sẽ rất mong manh (thay đổi Person
có thể yêu cầu "di chuyển" nội dung của BLOB để tránh các vấn đề deserialization và điều này sẽ trở nên đau đớn. Bạn nên thực sự xem xét lại ý tưởng này và sử dụng một bảng khác cho Person
thay vào đó (hoặc tôi không 't nhận được lý do tại sao bạn sử dụng cơ sở dữ liệu)
Nguồn
2010-01-23 10:50:35
Đây không phải là rõ ràng. Nếu bạn đang thấy familly như một nhóm người, thì bạn cần một bảng mới cho familly, ngoại trừ nếu bạn đại diện cho familly với một kiểu đơn giản như một số nguyên hoặc một chuỗi. – Kartoch
OT: Đó sẽ là một thiết kế tồi. –
Nếu gia đình có 3 thành viên, bạn sẽ thấy giá trị nào trong cột cơ sở dữ liệu? –