Hibernate/JPA中@OneToOne和@MapsId的使用

banq發表於2019-02-11

雙向@OneToOne的效率低於與父表共享主鍵的單向@OneToOne。因此,不要使用雙向@OneToOne,最好是依靠單向@OneToOne和@MapsId。

第一步:在子實體這邊使用@MapsId

@Entity
public class Desk implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id    
    private Long id;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId    
    private Employee employee;


基本上,上面@OneToOne關聯,它將與父表共享主鍵,父實體見如下,父實體中沒有@OneToOne,這說明是從子實體指向父實體的單向關聯:

@Entity
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }            
}



原始碼可以在這裡找到  。

如果使用DDD聚合設計,Desk和Employee誰是聚合根?無論誰是聚合根,都是聚合根實體要指向引用子實體,這時會與JPA的設計有衝突,需要權衡業務設計和效能的平衡。

相關文章