2009-02-27 32 views
11

Có ai thực sự muốn và sử dụng hỗ trợ kế thừa trên các công cụ ORM, và nếu có, bạn nghĩ cung cấp hỗ trợ tốt nhất?ORM Inheritance

Hoặc là ORM Thừa kế một khái niệm "chiếc bánh trên bầu trời"?

+0

những gì bạn có nghĩa là bởi ORM thừa kế? –

+0

Có thể có các lớp thực thể xuất phát từ các lớp thực thể khác. –

Trả lời

5

Tôi thích câu hỏi này rất nhiều. Tôi đã sử dụng các công cụ ORM (Toplink, bây giờ eclipselink, Hibernate) trong một thời gian và tôi đã luôn luôn nhìn thấy điều này như được tham chiếu trong các tài liệu JPA nhưng tôi chưa bao giờ thực sự có nhu cầu về nó. Về cơ bản, triết lý của tôi là ORM chỉ ở đó để ngăn bạn viết mã tedius để rút ra các bản ghi cho cơ sở dữ liệu. Đó thực sự là bộ tiết kiệm thời gian rất lớn và nó ngăn cản bạn làm sai lầm ngu ngốc. Chắc chắn bạn có thể làm những thứ ưa thích với điều này, nhưng tại sao không lưu nó cho bộ điều khiển (nếu bạn đang theo MVC) hơn dính nó trong mô hình?

+0

Vì vậy, bạn có thể nói phương pháp "một lớp cho mỗi bảng" truyền thống hoạt động cho hầu hết các trường hợp? –

+1

Trong trường hợp của tôi đó là những gì tôi đã luôn luôn tìm thấy. Sử dụng thừa kế ở đó chỉ gây nhầm lẫn cho IMO ánh xạ và có nhiều đồ chơi hơn bất kỳ thứ gì hữu ích. – GBa

3

Nếu bạn có nghĩa là thừa kế trong các lớp miền, tôi sử dụng nó mọi lúc với NHibernate và/hoặc Castle ActiveRecord, họ hỗ trợ các chiến lược ba bản đồ:

+0

Cảm ơn bạn, tôi sẽ kiểm tra chúng. –

+0

@Mauricio Tôi đang làm việc trên một dự án có một loại bản ghi mà chúng tôi sẽ gọi là "Master". Có khoảng 17 loại bản ghi chính, hầu hết có các trường dữ liệu tương tự nhưng mỗi trường có thể có một hoặc hai trường duy nhất. Những người trước tôi sử dụng thừa kế để tạo ra một lớp thực thể Master với 17 lớp con thực thể. Điều đó có vẻ tuyệt vời lúc đầu, nhưng sau khi làm việc với nó trong một thời gian, tôi tự hỏi nếu một bảng 'Master' cho phép giá trị null có thể không tốt hơn (ví dụ:Hiện có 17 bảng khác nhau trong cơ sở dữ liệu, tôi không thể thay đổi một loại khác dễ dàng). Tôi thực sự sẽ đánh giá cao suy nghĩ của bạn. – theblang

+0

@mattblang Xin chào Matt, đừng nhầm lẫn sự thừa kế trong các lớp miền với chiến lược lập bản đồ. Bạn có thể có 17 lớp con được ánh xạ tới các bảng riêng lẻ hoặc tới một bảng đơn, kiểm tra các tài liệu NHibernate để tham khảo. Nếu bạn cần thay đổi loại này sang loại khác, bạn đã nhận thấy rằng thừa kế nói chung và bảng cho mỗi lớp nói riêng, không hoạt động tốt. –

6

Tôi đã sử dụng thừa kế với Hibernate (và một số với Django), và rất tiếc nó.

Nguyên tắc "thành phần thừa kế" đặc biệt đúng đối với các lớp miền. Trong khi tôi đồng ý rằng có một vài trường hợp thừa kế có ý nghĩa ở cấp mô hình, trong phần lớn trường hợp, kế thừa sẽ cung cấp cho bạn một mô hình miền rất tĩnh, trong đó một đối tượng sẽ không thể thay đổi sang lớp khác.

Tôi cũng thấy rằng hầu hết các nhà phát triển không thoải mái với khái niệm kế thừa ở cấp cơ sở dữ liệu, do đó việc bảo trì trở nên phức tạp hơn.

Và cuối cùng, có một số vấn đề kỹ thuật, như proxy được đưa ra bởi Hibernate sẽ ẩn lớp actuall của một đối tượng. Nó làm cho "trường hợp" hành xử một cách vất vả. Tất nhiên, bạn có thể nói rằng "trường hợp" là một mã ngửi và có thể đó là một gợi ý rằng bố cục có lẽ là giải pháp tốt hơn ...

+0

Hình như một lớp học thẳng cho mỗi bảng (với bố cục) là cách để đi từ những gì tôi đang đọc ở đây. Cảm ơn vì sự thấu hiểu. –

+0

không đồng ý. Nếu bạn ghi nhớ rằng bạn không thể thay đổi một thực thể từ lớp này sang lớp khác, đây là một kỹ thuật rất mạnh vì nó cho phép bạn áp dụng kiến ​​thức OOP phổ biến của bạn cho một mô hình quan hệ khác. –

+0

Như để kiểm tra loại thực tế đằng sau một proxy, nó RẤT mùi ... sử dụng một khách truy cập hoặc đa hình: http://www.hibernate.org/280.html –

1

Nếu bạn viết phần mềm kinh doanh phức tạp, bạn cần nó.

Giả sử bạn muốn có thể bán nội dung cho các cá nhân hoặc tổ chức. Trên một đơn đặt hàng, người mua sẽ là một hoặc khác. Làm thế nào để bạn làm điều đó mà không có thừa kế?

Với thừa kế, bạn muốn làm điều gì đó như thế này:

@Entity 
@Inheritance 
public abstract class Party { 

    @Id 
    private Long id; 

    ... 
} 

@Entity 
public class Individual extends Party { 
    ... 
} 

@Entity 
public class Organization extends Party { 
    ... 
} 

@Entity 
public class SalesOrder { 

    private Party buyer; 

    ... 
} 

Sau đó, bạn có thể làm:

salesOrder.setBuyer(someOrganization) hoặc salesOrder.setBuyer(someIndividual)