2016-07-06 19 views
0

我在JPA映射初學者。我有一個簡單的實體(本質上是一個2D矩陣),爲每個產品組/成本組合指定一個值。現在加載數據在JPA

@Entity 
public class CostDistribution { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @NotNull 
    @OneToOne 
    private ProductGroup productGroup; 

    @NotNull 
    @OneToOne 
    private CostGroup costGroup; 

    private Long value; 
} 

我想獲得只讀訪問時ProductGroup裝入此矩陣的相應列(即加載所有CostDistribution記錄中,其中product_group_id等於當前產品組的ID)。我無法弄清楚如何做到這一點。這是我的嘗試:

@ElementCollection 
@CollectionTable(name="cost_distribution", [email protected](name="product_group_id")) 

,但我得到一個異常:Same physical table name [cost_distribution] references several logical table names: [CostDistribution], [cost_distribution]

什麼我誤解嗎?

@Entity 
public class ProductGroup { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @Column(length=50) 
    @NotNull 
    @Size(max=50) 
    private String name; 

    @??? 
    private List<CostDistribution> costDistribution; 
} 
+0

不知道該映射應該表示什麼。如果這是1-N bidir(ProductGroup -CostDistribution),那麼它應該是'@ OneToMany'。當元素不是實體時,只能使用'@ ElementCollection'。任何JPA文檔都應該解釋 –

+0

ProductGroup和CostGroup是簡單的表格,基本上是一個ID和一個名稱。 CostDistribution將一個值映射到ProductGroup和CostGroup的每個組合。它的結構是'product_group_id,cost_group_id,value'。 – Arthur

回答

0

正確答案從基質裝入相關的數據:

@OneToMany(mappedBy="productGroup", fetch=FetchType.EAGER) 
private List<CostDistribution> costDistribution; 

此加入從連接器表中的正確列。例如,裝入id = 1的產品組時:

select productgro0_.id as id1_6_0_, productgro0_.name as name2_6_0_, ..., costdistri1_.value as value2_2_2_, 
from product_group productgro0_ 
left outer join cost_distribution costdistri1_ on productgro0_.id=costdistri1_.product_group_id 
left outer join cost_group costgroup2_ on costdistri1_.cost_group_id=costgroup2_.id where productgro0_.id=1