Chúng tôi sử dụng kế thừa bảng đơn cho mỗi bảng trong ứng dụng của chúng tôi. Điều này cho phép các phiên bản khác nhau của cùng một ngăn xếp ứng dụng hoạt động với cùng một DAO trong khi các thực thể của chúng có thể hơi khác nhau có khả năng chứa thông tin duy nhất cho cá thể đó. Một lớp trừu tượng xác định cấu trúc bảng cơ bản và một phần mở rộng định nghĩa các cột bổ sung, nếu cần thiết bằng cách dụ rằng:Tôi có thể loại bỏ cột phân biệt đối xử trong kế thừa bảng đơn Hibernate không?
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "client")
public abstract class Client extends AbstractPersistable<Long> {
// ...
}
ứng dụng A:
@Entity
public class ClientSimple extends Client {
private String name;
// getter, setter
}
ứng dụng B:
@Entity
public class ClientAdvanced extends Client {
private String description;
// getter, setter
}
Bây giờ một DAO có thể làm việc với Client
đối tượng cho ứng dụng A và B nhưng ứng dụng B có thể xác định thông tin bổ sung cho đối tượng máy khách của nó mà có thể được đọc bởi một phương thức quản lý duy nhất e để ứng dụng B:
ứng dụng A:
Client client = new ClientSimple();
clientDao.save(client);
ứng dụng B:
Client client = new ClientAdvanced();
clientDao.save(client);
Đáng tiếc là điều này có nghĩa là một cột DTYPE trong mỗi bảng (hoặc bất kỳ tên khác mà tôi có thể chọn) . Có cách nào để loại bỏ điều này không? Chúng tôi không cần nó và nó sử dụng lên không gian DB ...
Cảm ơn!
EDIT
quan trọng cần lưu ý: @MappedSuperclass
sẽ không hoạt động. Chúng tôi đang sử dụng QueryDSL làm lớp trừu tượng HQL của chúng tôi. Điều này yêu cầu các lớp Kiểu truy vấn được tạo tự động cho kiểu lưu truy vấn. Tuy nhiên, những điều này sẽ chỉ được tạo chính xác nếu lớp trừu tượng được chú thích với @Entity
.
Đây là neccessairy vì chúng ta muốn truy vấn so với lớp trừu tượng Client
trong khi sự thật truy vấn ClientSimple
trong ứng dụng A và ClientAdvanced
trong ứng dụng B:
Vì vậy, trong bất kỳ ứng dụng này sẽ làm việc:
query.where(QClient.client.name.equals("something");
và trong ứng dụng B, điều này sẽ hoạt động:
query.where(QClientSimple.client.description.equals("something else");
EDIT2 - đun sôi xuống
Dường như để đun sôi xuống này: Tôi có thể cấu hình ngủ đông vào thời điểm triển khai để thiết lập kiểu phân biệt cho một thực thể inhertited đến một giá trị cố định. Vì vậy, với ví dụ của tôi, Client
sẽ luôn là ClientSimple
trong một ứng dụng và ClientAdvanced
trong trường hợp khác để tôi không phải lưu trữ thông tin đó trong cơ sở dữ liệu?
Như tôi đã nói: Mỗi ứng dụng sẽ là một phiên bản của ngăn xếp ứng dụng cơ sở. Mỗi ứng dụng có thể định nghĩa các cột bổ sung cho cơ sở dữ liệu cục bộ của chúng, nhưng TẤT CẢ các đối tượng sẽ có cùng kiểu cho cá thể đó, vì vậy chúng tôi đảm bảo rằng phân biệt đối xử luôn làm cho nó dư thừa trong cơ sở dữ liệu và một trường hợp sử dụng cho cấu hình ngủ đông.
Bạn đang sử dụng phiên bản Querydsl nào? –
Chúng tôi đang sử dụng QueryDSL 2.2.3 nhưng có thể cập nhật nếu các phiên bản mới hơn hỗ trợ các siêu lớp được ánh xạ làm mục tiêu truy vấn: như sau: '@MappedSuperclass @Table lớp trừu tượng công khai Client ...' + '@Entity public class ClientSimple mở rộng Client' == > tạo các loại truy vấn ... ==> truy vấn: 'QClient.client.name' – Pete
Nó không được hỗ trợ trực tiếp, nhưng bạn có thể thêm một vé cho nó trên GitHub. Nó dễ dàng thực hiện. –