2009-04-28 44 views
21

tôi muốn làm một cái gì đó như thế này:Bản đồ một danh sách các chuỗi với JPA/Hibernate chú thích

@Entity public class Bar { 
     @Id @GeneratedValue long id; 
     List<String> Foos 
    } 

và có Foos tồn tại trong một bảng như thế này:

foo_bars (
    bar_id int, 
    foo varchar(64) 
); 

UPDATE:

Tôi biết cách ánh xạ các thực thể khác, nhưng nó quá mức cần thiết trong nhiều trường hợp. Dường như những gì tôi đề xuất là không thể mà không tạo ra một thực thể khác hoặc kết thúc với tất cả mọi thứ trong một số cột blob.

Trả lời

27

Đây là trong Hibernate terms một "tập hợp các giá trị" hoặc "các phần tử". Có một chú thích (Hibernate cụ thể) cho nó. JPA không hỗ trợ điều này (chưa).

Nói tóm lại, chú thích sưu tập của bạn như thế này:

@CollectionOfElements 
@JoinTable(
     [email protected](name="..."), 
     joinColumns = @JoinColumn(name="...") // References parent 
) 
@Column(name="...value...", nullable=false) 

Điều này sẽ tạo ra các bảng cần thiết với các phím nước ngoài và hạn chế.

+28

Với JPA 2, bạn có thể thực hiện điều này một cách hợp lý với chú thích ElementCollection, về cơ bản là một phiên bản tiêu chuẩn của CollectionOfElements và cho phép bạn có các bộ sưu tập của Embeddables hoặc các loại cơ bản, bao gồm các chuỗi: http: //en.wikibooks. org/wiki/Java_Persistence/ElementCollection –

0

tạo một thực thể 'FooBars'

Refactor các attribut 'Foos' để

@OneToMany Danh sách Foos

+1

Cảm ơn, Michael, nhưng tôi đã hy vọng tránh một thực thể khác ở đây .. Tôi thực sự chỉ cần chuỗi trong mọi trường hợp .. Tôi đã hy vọng được ngủ đông để giải quyết tất cả cho tôi. – danb

0

Tôi nghĩ đó là những gì bạn cần:

@Entity 
public class Bar { 
    @Id @GeneratedValue long id; 

    @OneToMany(mappedBy="bar") //"bar" = field name in mapping class 
    List<FooBar> Foos; 
} 

@Entity 
public class FooBar { 
    @Id @GeneratedValue long id; 

    @ManyToOne 
    @JoinColumn(name="bar_Id") 
    Bar bar; 
} 
+3

cảm ơn Vanger, nhưng tôi đã hy vọng tránh một thực thể khác ở đây .. Tôi thực sự chỉ cần chuỗi trong mọi trường hợp .. Tôi đã hy vọng để có được ngủ đông để đối phó tất cả cho tôi. – danb

3

Nếu bạn lưu trữ danh sách của bạn như là một mảng, nó hoạt động:

setFoos(String[] foos); 

bạn có thể biến nó như thế này:

setFoos(myList.toArray(new String[myList.size()])); 
27

Đây là cách bạn sẽ làm điều này nếu bạn đang sử dụng JPA2:

@Entity public class Bar { 
    @Id @GeneratedValue long id; 

    @ElementCollection 
    @CollectionTable(name="foo_bars", [email protected](name="bar_id")) 
    @Column(name="foo") 
    List<String> Foos; 
} 

Để biết ví dụ rõ ràng hơn, xem phần 2.2.5.3.3 trong the Hibernate Annotations Reference Guide.

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