我是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")
?
答案 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
表中,而不是另一侧。