2015-08-12 15 views
5

Là mới đối với ORM, tôi muốn tìm cách xác định ánh xạ đơn giản (nghĩa là không có thực thể bổ sung) cho danh sách (hoặc tập hợp) các chuỗi trong thực thể. Tôi đã tìm thấy mẫu này:Lập bản đồ JPA cho một Danh sách hoặc Thiết lập <String>

import java.util.Set; 

import javax.persistence.CollectionTable; 
import javax.persistence.Column; 
import javax.persistence.ElementCollection; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 

@Entity 
public class Book { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @ElementCollection 
    @CollectionTable(name = "tags") 
    private Set<String> tags; 

    public Long getId() { 
    return id; 
    } 

    public void setId(Long id) { 
    this.id = id; 
    } 

    public Set<String> getTags() { 
    return tags; 
    } 

    public void setTags(Set<String> tags) { 
    this.tags = tags; 
    } 
} 

dường như phù hợp với nhu cầu của tôi. Tuy nhiên, chế biến lớp này với Eclipse hibernate3-maven-plugin:2.2:hbm2ddl, tôi kết thúc với các lỗi sau:

[ERROR] Failed to execute goal org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm2ddl (default) on project test-database: Execution default of goal org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm2ddl failed: Could not determine type for: java.util.Set, at table: Book, for columns: [org.hibernate.mapping.Column(tags)] -> [Help 1]

Xác định @ElementCollection(targetClass=String.class) không giúp đỡ. Thêm một định nghĩa cột vào tags trường (@Column(name = "tags", columnDefinition="character varying (255)", nullable = false)) dẫn đến một xây dựng thành công nhưng sản xuất SQL này:

create table Book (
    id int8 not null, 
    tags character varying (255) not null, 
    primary key (id) 
); 

mà không phải là những gì tôi muốn, như tôi đã mong đợi để kết thúc với một bảng tags liên quan đến những cuốn sách bàn. Ai đó có thể chỉ cho tôi hướng đi đúng không? Cảm ơn bạn.

Trả lời

2

@ElementCollection đã được giới thiệu trong JPA v 2.0: ánh xạ bạn đã làm là đúng. Tuy nhiên hãy chắc chắn rằng các plugin hibernate maven bạn sử dụng là ở phiên bản chính xác. Bản thân Hibernate tương thích với JPA 2.0 bắt đầu từ phiên bản 3.5.

+0

W00t! Cảm ơn bạn. Thật vậy, các plugin sử dụng một phiên bản cũ của Hibernate. Cập nhật pom lên phiên bản mới hơn đã giải quyết được vấn đề. – Blablalux

0

Bạn nên tạo một bảng Tag: TAG_ID pk, book_id tài liệu tham khảo id fk từ cuốn sách và bất kỳ cột khác mà bạn muốn và bản đồ bạn liệt kê với một cái gì đó như:

@OneToMany(mappedBy="book",fetch=FetchType.LAZY, cascade=CascadeType.REMOVE) 

tạo lớp thẻ của bạn với tất cả các cột của bạn từ cơ sở dữ liệu + một đối tượng tên là Book cuốn sách cho exemple và bản đồ cuốn sách này với:

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="id",insertable=false,updatable=false) 
+0

ít nhất đây là cách tôi sẽ xử lý nó, nhưng tôi cũng mới để ngủ đông – dskfdskjgds

+0

Cảm ơn câu trả lời của bạn. Vâng tôi biết rằng giải pháp của bạn sẽ phù hợp. Tuy nhiên, tôi đã đề cập cụ thể rằng tôi không muốn tạo một thực thể bổ sung. Tôi nghĩ đây là mục đích của chú thích '@ ElementCollection' và' @ CollectionTable'. – Blablalux

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