弹簧数据的奇怪行为jpa

时间:2016-11-11 16:26:16

标签: java spring hibernate jpa

我是JPA的新手,我有一个案例,在我看来,JoinColumn表现不同,我想知道原因。

UserEntites应该加入作者。

组织应加入OrganizationSettings。

我有两种不同的方法,都有效。

案例1

UserEntity:

    @Entity
@Table(name = "users")
@Inheritance(strategy = InheritanceType.JOINED)
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "userId")
    private List<UserAuthority> authorities;
}

UserAuthoritiesEntity

@Entity(name = "authorities")
@Table(name = "authorities")
public class UserAuthority {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Long userId;

    private String authority;
}

在我看来,JoinColumn名称引用了UserAuthority.userId - 它按预期工作。

案例2

请参阅我的其他两个课程:

OrganizationEntity:

@Entity
@Table(name="organization")
public class OrganizationEntity {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private String url;

    @NotNull
    private String name;

    @OneToOne (cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name="id",updatable = false)
    private OrganizationSettingsEntity settings;
}

OrganizationSettings:

    @Entity
@Table(name = "organization_settings")
public class OrganizationSettingsEntity {

    @Id
    private Long organizationId;
}

正如你在这里看到的那样 - &gt;组织是使用名称id加入OrganizationSettings - 这是有效的。但是在OrganizationSettings中没有id - just organizationId。这有效 - 但令我惊讶。

为什么第二个也有效?不应该是@JoinColumn(name="organizationId")

1 个答案:

答案 0 :(得分:2)

春天与它无关。 JPA是标准API。

1-N情况:您将在authorities表中创建一个名为userId的FK列(链接回users表)。您似乎还想重新使用元素中此userId字段的相同列...这会导致您迟早遇到问题,因为重用列而不将userId字段标记为insertable=false, updatable=false将意味着两者都可能尝试更新它。要么删除元素中的userId字段,要么将字段转换为UserEntity类型(并将其作为双向关系,在1-N所有者字段上使用mappedBy ),或使用前面提到的那些属性标记userId字段。

1-1 case:您将在organization表中创建一个名为id的FK列(链接到organization_settings表)。遗憾的是,这与该表的PK将使用相同的列,因此您再次使用该列进行2个不同的目的,并且将导致地狱。将关系FK的列更改为不同的 - FK位于organization表中,而不是另一侧。