2012-01-15 25 views
10

Tôi nhìn rất nhiều vào việc có thể sử dụng Hibernate để duy trì một bản đồ như Map<String, Set<Entity>> với ít may mắn (đặc biệt là kể từ khi tôi muốn tất cả được trên một bảng).Có cách nào tốt hơn để duy trì một bản đồ với giá trị là một tập hợp không?

Mapping MultiMaps with Hibernate là điều dường như được tham chiếu nhiều nhất, mô tả chi tiết cách thực hiện điều này bằng cách sử dụng UserCollectionType.

Tôi đã tự hỏi, vì điều đó đã được viết hơn bốn năm trước, có cách nào tốt hơn để thực hiện ngay bây giờ không?

Vì vậy, ví dụ: tôi muốn có trên EntityA một bản đồ như Map<String, Set/List<EntityB>>.

Sẽ có hai bảng: EntityAEntityB (với EntityB có khóa ngoại trở lại EntityA).

Tôi không muốn bất kỳ bảng trung gian nào.

+1

IMO vẫn là cách để đi – Firo

+0

Tôi không thấy lý do tại sao điều này xứng đáng với việc giảm giá hoặc đóng. Có một cách "tốt nhất" được trình bày nhưng đã được bốn tuổi.Tôi không nghĩ rằng nó không hợp lý để hỏi nếu có một cách tốt hơn bây giờ. Có lẽ tôi nên có đủ điều kiện tốt hơn như ít tiết hoặc đơn giản hơn, nhưng nó vẫn không thực sự tranh luận hay một ý kiến. Có một câu trả lời hay không. – AHungerArtist

+0

+1 để bù đắp số tiền giảm. IMO là một câu hỏi pháp lý. – Firo

Trả lời

-1

Nó phụ thuộc :) Khi mọi thứ trở nên phức tạp, bạn nên hiểu những gì ứng dụng của bạn đang làm.

Trong một số trường hợp, bạn có thể biểu diễn Set là TreeSet và đại diện TreeSet này trong chuỗi được mã hóa theo thứ tự, chẳng hạn như ["1", "8", "12"] trong đó 1, 8, 12 và sau đó , hãy viết mã!

Rõ ràng, đó không phải là câu trả lời chung, theo ý kiến ​​của tôi, một câu hỏi quá chung chung.

1

Cách làm thế nào nó được thực hiện trong dự án hiện tại của tôi là chúng ta chuyển đậu/bộ sưu tập để xml sử dụng xStream:

public static String toXML(Object instance) { 
    XStream xs = new XStream(); 
    StringWriter writer = new StringWriter(); 
    xs.marshal(instance, new CompactWriter(writer)); 
    return writer.toString(); 
} 

và sau đó sử dụng Lob gõ vào ngủ đông cho sự bền bỉ:

@Lob 
@Column(nullable = false) 
private String data; 

tôi tìm thấy cách tiếp cận này rất chung chung và bạn có thể triển khai hiệu quả khóa/giá trị linh hoạt với nó. Bạn không thích định dạng XML thì khung Xstream có trình điều khiển sẵn có để chuyển đổi các đối tượng thành JSON. Hãy thử nó, nó thực sự tuyệt vời.

Chúc mừng

EDIT: Trả lời nhận xét. Có, nếu bạn muốn vượt qua những hạn chế của cách tiếp cận cổ điển, bạn có thể hy sinh điều gì đó như lập chỉ mục và/hoặc tìm kiếm. Bạn stil có thể thực hiện các mối quan hệ lập chỉ mục/tìm kiếm/ngoại lai/con thông qua các bộ sưu tập/các bean thực thể chung - chỉ cần duy trì bảng khóa/giá trị riêng biệt với tên thuộc tính/giá trị thuộc tính mà bạn nghĩ tìm kiếm là cần thiết.

Tôi đã thấy số lượng thiết kế cơ sở dữ liệu cho các sản phẩm linh hoạt và năng động (tức là tạo thuộc tính mới cho đối tượng miền không có thời gian chết) và rất nhiều trong số đó sử dụng bảng khóa/giá trị để lưu trữ thuộc tính miền và tham chiếu từ đối tượng chủ sở hữu cho đứa trẻ. Những sản phẩm này tốn hàng triệu đô la (ngân hàng/viễn thông) vì vậy tôi đoán thiết kế này đã được chứng minh là có hiệu quả.

Rất tiếc, đó không phải là câu trả lời cho câu hỏi ban đầu của bạn vì bạn đã hỏi về giải pháp không có bảng trung gian.

+0

Giải pháp thú vị. Tuy nhiên, điều này làm cho nó khá khó khăn/không hiệu quả để sử dụng trong một tìm kiếm, thật không may. – AHungerArtist

+0

Đã trả lời chỉnh sửa. –

Các vấn đề liên quan