Java spring数据jpa的奇怪行为
我是JPA的新手,我有一个案例,我认为JoinColumn的行为不同,我想知道为什么 UserEntite应该加入authorites 组织应加入组织设置 我有两种不同的方法,而且都有效 案例1 用户实体: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
@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;
}