2016-07-06 56 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