Tôi sẽ đề xuất một cách tiếp cận khác mặc dù đó là một câu hỏi hơi cũ. Thay vì tạo hai thực thể, bạn nên tạo ba thực thể.
Tạo FileMetadata, chứa tên, mimetype, v.v. Tạo FileContent, chứa nội dung. Sau đó, tạo một Tệp thực thể thứ ba chứa kết nối 1-1 với một trong các loại khác và cung cấp cho nó một loạt các phương thức mà chỉ cần gọi các phương thức so khớp trên các thực thể con.
Vì vậy, ví dụ trong File, phương thức setName sẽ giống như sau:
public function setName() {
$this->getFileMetadata()->getName();
}
Và bộ sẽ giống như thế này:
public function setName( $name ) {
$this->getFileMetadata()->setName( $name );
}
Phương thức khởi tạo của thực thể Tệp phải tạo một FileMetadata mới và một FileContent mới khi tạo và KHÔNG được có phương thức setFilemetadata hoặc setFilecontent; hai thực thể này phải được bảo vệ hoàn toàn khỏi ứng dụng của bạn.
Bây giờ bạn có thực thể Tệp, xử lý chính xác như bạn muốn (một thực thể duy nhất, không có thực thể con bổ sung) vẫn được lưu trữ gọn gàng trong hai (tốt, ba bảng thực sự) khác nhau.