2015-11-30 15 views
1

我想休眠與此列來建立我的只有1臺:地圖@ElementCollection到同一個表

id | product_id | enum_id 
1 1   1 
2 1   2 

即每個產品可以有許多枚舉。我不想介紹新的鏈接表。

所以我的問題是如何註釋我的領域來實現這樣的表結構。

到目前爲止,我有這個實體:

@Entity 
public class Entity { 

    @Id 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "product_id") 
    private Product product;  

    @ElementCollection 
    @??? // what should go here? 
    private List<Enum> enums = new Arralist<>(); 
} 
+0

像這樣@CollectionTable(NAME = 「the_table_name」,joinColumns = @ JoinColumn(name = 「PRODUCT_ID」)) \t @Column(name = 「PRODUCT_ID」)? – StanislavL

回答

1

你的建議表將會有確切一個產品和一個Entity枚舉實例。這與您的註釋沒有任何關係,但是由於每個行都有自己的ID,因此實體將始終爲每行生成一個新實例。

如果你刪除ID列,比給定的表已經是你的鏈接表,你只需要批註Product實體:

@Entity 
public class Product { 
    // ... 

    @ElementCollection 
    @Enumerated 
    private Set<MyEnum> enums; 

} 

您將需要申報Enum的類型,在我例如MyEnum,因爲你不能綁定到任何Enum(當從數據庫讀取時,Hibernate不知道要實例化哪一個)。

如果你想堅持任何現有的表或列的名稱,你可以使用額外的@CollectionTable。但我會建議使用默認值,因爲它使代碼更易於閱讀。

如果您真的像在第一次嘗試時那樣需要枚舉列表(允許重複項和存儲項的排序),那麼您需要爲列表中的索引添加一列。你可以做到這一點有:

@ElementCollection 
@Enumerated 
@OrderColumn 
private List<MyEnum> enums; 
0

我可以看到,你會添加不同的值多行,爲什麼不能是這樣的:

@Entity 
public class Entity { 

    @Id 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "product_id") 
    private Product product;  

    @Enumerated(EnumType.STRING) 
    private Enum enum; 

,然後你可以添加多行連接到product_id的多個枚舉。如果你想擁有一個只爲每個產品的位置,你可以使用@StanislavL提到的方法:

@ElementCollection 
@CollectionTable(name="the_table_name", [email protected](name="product_id")) @Column(name="product_id") 
private Enum enum; 
+0

沒有集合的'@ ElementCollection'沒有任何意義。在OP的例子中,表格包含'enum'的序號,而不是字符串。 –

相關問題