2009-05-21 26 views
6

Tôi có một thực thể liên tục có danh sách @OneToMany của một pháp nhân khác và tôi cần thứ tự danh sách để người dùng có thể chỉnh sửa, hoạt động tuyệt vời. Tôi hoàn toàn có thể sắp xếp lại danh sách java trong bộ nhớ và khi tôi lưu() đối tượng thứ tự các liên kết trong bảng liên kết sẽ thay đổi. Tuy nhiên, nó thay đổi theo thứ tự ngược lại của những gì người dùng thiết lập. Tuy nhiên, nếu bạn kéo thực thể sao lưu trước khi đóng chương trình, nó sẽ hiển thị chính xác, vì nó không tải lại. Nếu bạn tải lại chương trình, một lần nữa, nó quay trở lại.hibernate OneToMany Danh sách đặt hàng bền vững nhưng đảo chiều?

Đây không phải là điều tôi phải làm, phụ thuộc vào thứ tự đó? Nhưng làm cho một cột thứ tự khác có vẻ dư thừa vì có một đơn đặt hàng, và tôi có thể thay đổi nó. Tôi chỉ cần nó để tiết kiệm không lùi.

Bất kỳ ý tưởng nào?

+0

ARGH! Vấn đề này khiến tôi phát điên, tôi nghĩ tôi đã sửa nó nhưng tôi đã sai. Nó chỉ đảo ngược thứ tự Khi tôi thay đổi thứ tự, mặc dù tôi nhận được lệnh đảo ngược thứ tự mà tôi đã chọn! Tại sao điều này xảy ra, tôi có thể mở một đối tượng, thay đổi thứ tự của danh sách, lưu() nó và làm mới() nó và bây giờ thứ tự được đảo ngược! – Joshua

Trả lời

0

Bạn đã triển khai compareTo trên hệ thống phân cấp đối tượng đó chưa?

2

Lớp Hibernate của bạn có sử dụng Bộ không? Tôi tin rằng nó làm theo mặc định. Giao diện được thiết lập (và việc triển khai cụ thể) không duy trì thứ tự chèn.

Hoặc, bạn có thể muốn xem các truy vấn của mình, bạn có đang sử dụng "thứ tự" không?

Tôi cũng đang thử xem bộ sưu tập trong bộ nhớ bằng cách sử dụng trình gỡ lỗi. Mã xem của bạn có thể sắp xếp lại Bộ sưu tập. Ít nhất trình gỡ lỗi sẽ hữu ích khi xem chính xác điểm thu thập của bạn đang được đảo ngược.

2

Tôi nghĩ rằng không có cách nào để đạt được điều này trực tiếp với danh sách. Chúng tôi tại nơi làm việc sử dụng như sau:

Nếu bạn muốn cung cấp cho người dùng toàn quyền kiểm soát của bạn trong thứ tự của các đối tượng, bạn nên thêm một lĩnh vực mới ví dụ:

@Entity 
public class Todo { 
    @Id private Long id; 
    private int position; 
    // + public setter/getter 
} 

@Entity 
public class Todos { 
    @Id private id; 

    @OneToMany 
    private List<Todo> todos = new LinkedList<Todo>(); 
    // + public setter/getter  
} 

và sau đó đặt một trật tự của vị trí trong tất cả các truy vấn hoặc thực hiện một Comparator cho Todos và sử dụng Collections.sort (List lst, Comparator cmp) để sắp xếp danh sách của bạn trong bộ nhớ.

public class TodoComparator implements Comparator { 
    public int compare(Object o1, Object o2) { 
    Todo t1 = (Todo)o1; 
    Todo t2 = (Todo)o2; 
    return t2.getPosition() - t1.getPosition(); 
    } 
} 

Collection.sort (todos, new TodosComparator());

sau khi người dùng của bạn được hoàn tất để sắp xếp lại danh sách, (trước khi lưu) renumber danh sách:

for(int pos=0; pos < todos.size(); pos++) 
    todos.get(pos).setPosition(pos); 

và lưu todos. Và tận hưởng toàn quyền kiểm soát.

+0

Xin chào Joshua, nếu câu trả lời của tôi có giúp bạn vui lòng bỏ phiếu cho tôi hay đánh dấu bằng dấu kiểm màu xanh lục không? (Để đưa ra câu trả lời đúng là rất nhiều công việc) – H2000

+0

Câu trả lời hay. Nhưng bạn nên định dạng mã của mình. –

+0

Thxs, tôi đã tạo mã. – H2000

0

Bạn có đang điều hành trực tiếp trong danh sách không?

object.getItems().add/remove/set ... 

Hãy thử thay vì thực hiện một bản sao

List items = new ArrayList(object.getItems()); 

sau đó hoạt động trên đó, sau đó thiết lập các bộ sưu tập đầy đủ trong một shot:

object.setItems(items) 
4

Hibernate đã hỗ trợ của các yếu tố đã ra lệnh sử dụng IndexColumn chú thích.

Dưới đây là một ví dụ từ "Java Persistence with Hibernate" book:

@org.hibernate.annotations.CollectionOfElements 
@JoinTable(
name = "ITEM_IMAGE", 
joinColumns = @JoinColumn(name = "ITEM_ID") 
) 
@org.hibernate.annotations.IndexColumn(
name="POSITION", base = 1 
) 
@Column(name = "FILENAME") 
private List<String> images = new ArrayList<String>(); 
1

Tôi chạy vào cùng một vấn đề, và tôi cố định nó chỉ đơn giản bằng cách thêm @OrderBy chú thích như đề xuất trong bài viết khác here. Tôi nghĩ rằng nó sẽ có thể giải quyết vấn đề của bạn là tốt, đây là mã của tôi:

@Entity 
    @Table(name = "my_library") 
    public class MyLibrary implements java.io.Serializable{ 

    (...omitted) 

    private List<Book> bookList = new ArrayList<Book>(); 

    @OneToMany(mappedBy = "library", cascade = CascadeType.ALL) 
    @OrderBy 
    public List<Book> getBookList() { 
     return bookList; 
    } 

    public void setBookList(List<Book> bookList) { 
     this.bookList= bookList; 
    } 

    } 

Sau đó, tôi có thể getBookList() như theo thứ tự tôi chèn trong khi kiên trì để DB. Khi chúng tôi không chỉ định tên cột như @OrderBy ("xxxColumn"), nó sử dụng khóa chính của thực thể đó theo mặc định. Trong trường hợp của tôi, nó sử dụng instanceId of Book, nó sẽ luôn luôn theo thứ tự như thứ tự chèn, vì vậy nó phục vụ nhu cầu của tôi tốt.

Tuy nhiên, tôi rất tò mò về lý do tại sao đơn đặt hàng được đảo ngược ngay từ đầu.

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