gpt4 book ai didi

java - spring data jpa的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 03:14:12 25 4
gpt4 key购买 nike

我是 JPA 新手,在我看来,JoinColumn 的行为有所不同,我想知道原因。

UserEntites应该加入权威。

组织应加入 OrganizationSettings。

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

案例1

用户实体:

    @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;
}

用户权限实体

@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

查看我的另外两个类(class):

组织实体:

@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;
}

组织设置:

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

@Id
private Long organizationId;
}

正如您在此处看到的 -> 组织正在使用名称 id 加入 OrganizationSettings - 有效。但在 OrganizationSettings 中没有 id - 只有organizationId。这可行 - 但让我想知道。

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

最佳答案

Spring 与此无关。 JPA 是一个标准 API。

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

1-1 案例:您将在 organization 表中创建一个名为 id 的 FK 列(链接到 organization_settings 表) 。遗憾的是,这与该表的 PK 将使用的列相同,因此您再次将该列重复用于 2 个不同的目的,结果将是 hell 。将关系 FK 的列更改为不同的内容 - FK 位于 organization 表中,而不是另一侧。

关于java - spring data jpa的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40552203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com