2017-07-03 83 views
0

所以没有我试过似乎工作。我想有这样的事情:如何将实体A与JPA以一对一的关系两次映射到实体B?

class A {  
    B foo; 
    B bar; 
} 

class B { 
    A baz; 
} 

我在课堂上一试了一下如下:

@OneToOne(targetEntity = B.class) 
@JoinColumn(name = "foo_id") 
@Cascade(CascadeType.ALL) 
public B getFoo() { 
    return foo; 
} 

@OneToOne(targetEntity = B.class) 
@JoinColumn(name = "bar_id") 
@Cascade(CascadeType.ALL) 
public B getBar() { 
    return bar; 
} 

这似乎并没有工作。由于我不明白的原因,我总是以foo_id和bar_id相同的方式结束。

所以当我检查表“A”在我的数据库为一行编号1,我想有:

foo_id = 1 
bar_id = 2 

,并在表B,我应该有2个实体ID为1和2,其中两个都有baz_id = 1;

回答

2

baz_id是否打算成为FK回A?因为我认为在这种情况下映射到模型的数据库是错误的。您已经建立了从B的PK到A.foo_id或A.bar_id的FK关系。

也要小心你的关系像这样的级联规则。 SQL Server将拒绝两个FK到同一个表,除非级联的DB操作是“无操作”。

我碰巧知道你想做什么在JPA是可能的,因为我最近才做这件事是一个实体自己:

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
@JoinColumn(name = "portal_logo_id", referencedColumnName = "id", nullable = true) 
private PortalResourceModel logo; 

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
@JoinColumn(name = "portal_favicon_id", referencedColumnName = "id", nullable = true) 
private PortalResourceModel favicon; 

我也没有在PortalResourceModel映射为徽标或favicon,因为关系的那一方不知道如何它正在使用。我无法从拥有方的多重关系到mappedBy方的单一关系进行通用映射。

+0

而在PortalResourceModel中,您没有参考回到您在此显示的实体? –

+0

我不这样做,因为我在这种情况下对双向关系不感兴趣。但即使我这样做了,它也会有一个'mappedBy'属性来表明我实际上并没有将关联关联两次。而数据库模式仍然只反映在一个地方的关系。 – Jeff

+0

而实际上,现在我正在寻找,那是你的问题。实体B中的baz_id不能同时映射到两个不同的关系。你应该删除它。更详细地更新了我的答案 – Jeff