我正在查看其他人的代码,我从未见过为一对一映射映射的密钥和对象,是否正常做这样的事情?
@Entity
@Table(name = "PROJECT_POINTER")
public class ProjectPointerEntity {
private static Logger LOG = LoggerFactory.getLogger(ProjectPointerEntity.class);
@Id
@SequenceGenerator(name = "seqGen", sequenceName = "PROJECT_POINTER_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqGen")
@Column(name = "PROJECT_POINTER_ID")
private Long projectPointerId;
@Column(name = "HOSTING_LOCATION_KEY")
private String hostingLocationKey;
@OneToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "HOSTING_LOCATION_KEY", insertable = false, updatable = false)
private HostingLocationEntity hostingLocation = new HostingLocationEntity();
public String getHostingLocationKey() {
return hostingLocationKey;
}
public void setHostingLocationKey(String hostingLocationKey) {
this.hostingLocationKey = hostingLocationKey;
}
public HostingLocationEntity getHostingLocation() {
return hostingLocation;
}
public void setHostingLocation(HostingLocationEntity hostingLocation) {
this.hostingLocation = hostingLocation;
}
}
答案 0 :(得分:2)
这是允许的,既有好处也有后果。您会注意到,在第二个映射中,OneToOne有一个JoinColumn注释,将该字段标记为insertable = false,updatable = false - 这实际上使OneToOne映射只读。因此,要更改字段/关系,需要使用待引用的HostingLocationEntity实例中的ID值设置hostingLocationKey。 OneToOne映射仍应更新,以使对象模型与数据库保持同步。除了保留两个属性之外,回退是必须预设要使用的ID值 - 如果是新的,JPA将不会为HostingLocationEntity分配ID,然后自动更新外键字段,因为外键映射不可更新/插入的。
其中一个好处是直接存在HOSTING_LOCATION_KEY外键的属性,允许应用程序直接在查询中使用它,而不是通过使用" projectPointerEntity.hostingLocation.id"来冒险进行表连接。在查询中,或者必须获取hostingLocation以获取id。虽然映射被标记为Eager,但最后的好处被否定,这意味着它总是被提取。因此,除非您的应用程序在JPA提供程序强制表连接的查询中使用hostingLocationKey,否则它可能是多余的,因为应用程序无论如何都可以从引用的hostingLocation访问它。