如何在与JPA的一对一关系中将实体A映射到实体B两次?

时间:2017-07-03 18:41:50

标签: java jpa

所以我试过的似乎没什么用。我想有这样的事情:

class A {    
    B foo;
    B bar;
}

class B {
    A baz;
}

我在A班尝试的内容如下:

@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”以获取id为1的行时,我希望:

foo_id = 1
bar_id = 2

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

1 个答案:

答案 0 :(得分: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中为徽标或图标提供映射,因为关系的这一方面并不知道 的使用方式。而且我不能拥有从拥有方的多个关系到mappedBy方的单个关系的通用映射。