Java spring数据jpa的奇怪行为

Java spring数据jpa的奇怪行为,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我是JPA的新手,我有一个案例,我认为JoinColumn的行为不同,我想知道为什么 UserEntite应该加入authorites 组织应加入组织设置 我有两种不同的方法,而且都有效 案例1 用户实体: @Entity @Table(name = "users") @Inheritance(strategy = InheritanceType.JOINED) public class UserEntity { @Id @GeneratedValue(strategy

我是JPA的新手,我有一个案例,我认为JoinColumn的行为不同,我想知道为什么

UserEntite应该加入authorites

组织应加入组织设置

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

案例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;
}
在我看来,这里的JoinColumn名称引用了UserAuthority.userId,并且它可以按预期工作

案例2

请参阅我的另外两个课程:

组织实体:

@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;
}
正如您在这里看到的->Organization正在使用名称id加入OrganizationSettings-这很有效。但是在OrganizationSettings中没有id—只有organizationId。这是可行的,但让我怀疑


为什么第二种方法也有效?它不应该是
@JoinColumn(name=“organizationId”)

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

1-N案例:您将在
权限
表中创建一个名为
用户ID
的FK列(链接回
用户
表)。您似乎还希望为元素中的
userId
字段重用同一列。。。这迟早会给您带来问题,因为重用列而不将
userId
字段标记为
insertable=false,updateable=false
将意味着两者都可能尝试更新它。要么去掉元素中的
userId
字段,要么将该字段转换为
UserEntity
类型(并将其作为双向关系,在1-N所有者字段上使用
mappedBy
),要么使用前面提到的属性标记
userId
字段


1-1案例:您将在
组织
表中创建一个名为
id
的FK列(链接到
组织设置
表)。遗憾的是,这与该表的PK将要使用的列是同一列,因此您再次出于两个不同的目的重用该列,结果将是地狱。将关系FK的列更改为不同的列-FK位于
组织
表中,而不是另一侧。

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

1-N案例:您将在
权限
表中创建一个名为
用户ID
的FK列(链接回
用户
表)。您似乎还希望为元素中的
userId
字段重用同一列。。。这迟早会给您带来问题,因为重用列而不将
userId
字段标记为
insertable=false,updateable=false
将意味着两者都可能尝试更新它。要么去掉元素中的
userId
字段,要么将该字段转换为
UserEntity
类型(并将其作为双向关系,在1-N所有者字段上使用
mappedBy
),要么使用前面提到的属性标记
userId
字段


1-1案例:您将在
组织
表中创建一个名为
id
的FK列(链接到
组织设置
表)。遗憾的是,这与该表的PK将要使用的列是同一列,因此您再次出于两个不同的目的重用该列,结果将是地狱。将关系FK的列更改为不同的列-FK在
组织
表中,而不是在另一边。

谢谢@neil-但我发现1-1的情况有点奇怪。当我通常构建我的MySQL表(没有JPA)时,例如,我在users中将id设为PK,然后在扩展表(比如users\u mentors)中设为user\u id。我认为这是相当标准的。你能给我一点代码说明怎么做吗?也许我能更好地理解:)你是说连接表?1-1不使用联接表。1-N可以使用联接表(如果您将其配置为)。参见中的1-N和中的1-1,这些都在JPA标准中。你需要选择合适的映射来实现你想要实现的目标(你还没有说清楚)同意:)我说得不够清楚。好的-那么1-1案例拥有一个设置\u id,而组织\u设置只有一个PK id?这就是你的意思吗?是的。FK是在业主方。谢谢@neil-但我觉得1-1案件有点奇怪。当我通常构建我的MySQL表(没有JPA)时,例如,我在users中将id设为PK,然后在扩展表(比如users\u mentors)中设为user\u id。我认为这是相当标准的。你能给我一点代码说明怎么做吗?也许我能更好地理解:)你是说连接表?1-1不使用联接表。1-N可以使用联接表(如果您将其配置为)。参见中的1-N和中的1-1,这些都在JPA标准中。你需要选择合适的映射来实现你想要实现的目标(你还没有说清楚)同意:)我说得不够清楚。好的-那么1-1案例拥有一个设置\u id,而组织\u设置只有一个PK id?这就是你的意思吗?是的。FK位于所有者一侧。
    @Entity
@Table(name = "organization_settings")
public class OrganizationSettingsEntity {

    @Id
    private Long organizationId;
}