JPA Id属性和Relationship属性

时间:2015-09-30 22:08:45

标签: java hibernate jpa

我在ASP.NET MVC中使用了Entity,模型类看起来像这样

public class Address()
{
    public int Id { get; set; }
    public string StreetLine1 { get; set; }
    public string StreetLine2 { get; set; }
    public string City { get; set; }
    public int StateId { get; set; }
    public string ZipCode { get; set; }

    public virtual State State { get; set; }
}

存储stateId属性和State对象的引用。但是我从来没有在JPA代码/示例中看到这一点。

在JPA中,它看起来如下:

public class Address implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "addressSeq")
    @SequenceGenerator(name = "addressSeq", sequenceName = "T_ADDRESS_SEQ", allocationSize = 1)
    @Column(name = "ID")
    private Long id;

    @Size(max = 255)
    @Column(name = "STREET_LINE_1")
    private String streetLine1;

    @Size(max = 255)
    @Column(name = "STREET_LINE_2")
    private String streetLine2;

    @NotBlank
    @Size(max = 255)
    @Column(name = "CITY")
    private String city;

    @NotBlank
    @Size(max = 10)
    @Column(name = "POSTAL_CODE")
    private String postalCode;

    // Mapping Properties
    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "STATE_ID", referencedColumnName = "ID")
    private State state;

    ....
}

将JPA实体中的实际StateID存储起来会有什么好处吗?

public class Address implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "addressSeq")
    @SequenceGenerator(name = "addressSeq", sequenceName = "T_ADDRESS_SEQ", allocationSize = 1)
    @Column(name = "ID")
    private Long id;

    @Size(max = 255)
    @Column(name = "STREET_LINE_1")
    private String streetLine1;

    @Size(max = 255)
    @Column(name = "STREET_LINE_2")
    private String streetLine2;

    @NotBlank
    @Size(max = 255)
    @Column(name = "CITY")
    private String city;

    // I'm new!!!!
    @Column(name = "STATE_ID", insertable = false, updatable = false)
    private Long stateId;

    @NotBlank
    @Size(max = 10)
    @Column(name = "POSTAL_CODE")
    private String postalCode;

    // Mapping Properties
    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "STATE_ID", referencedColumnName = "ID")
    private State state;

}

我认为stateId或state必须被标记为不可插入且不可更新,否则Hibernate会尝试同时执行这两种操作。

如果已经有一个引用的State对象,显示stateId有什么好处吗?这在JPA中很常见吗?

我的头脑以下我觉得主要的好处是你仍然可以在不必取出相关对象的情况下查看ID。

2 个答案:

答案 0 :(得分:1)

不,不需要。 你可以通过调用getter来获取它,正如Tunaki在评论中提到的那样。

实际上,hibernate维护对象之间的图形。

所以在坚持之前,你做的很简单......

address.setState()和state.setAddress();

答案 1 :(得分:0)

使用JPA,使用该id映射id和实体几乎没有意义。您可以这样做(前提是您将其中一个映射为只读),但在优化方面没有真正的好处。实际上,如果您将状态映射为急切,则无论您是通过stateId还是通过state.getId访问id,都始终从DB Address 中提取状态。 )。

如果要从数据库中检索stateId 而不检索整个状态实体,则可以使用延迟加载映射状态,如下所示:

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "STATE_ID", referencedColumnName = "ID")
private State state;

在这种情况下,只会创建一个代理对象而不是真正的State对象。此对象将仅保存状态的id,并且仅在需要其他数据时才会检索其他数据。

如果您随后发出address,getState().getId(),您将获得状态ID 而无需获取状态对象的完整数据。