映射JPA中的键和对象

时间:2014-06-24 15:49:48

标签: hibernate jpa

我正在查看其他人的代码,我从未见过为一对一映射映射的密钥和对象,是否正常做这样的事情?

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

}

1 个答案:

答案 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访问它。