簡體   English   中英

JPA實體關系指導

[英]JPA direction of entity relationships

我是JPA的新手,在理解“實體關系方向”概念時遇到一些困難,如下所述:

http://docs.oracle.com/javaee/7/tutorial/doc/persistence-intro001.htm#BNBQI

是在設計實體時選擇單向性還是雙向性,還是由數據庫模式提供? 就像在順序應用程序( http://docs.oracle.com/javaee/7/tutorial/doc/persistence-basicexamples001.htm ),你能不能例如設計它,以便lineitem知道哪些訂單是屬於,但order不知道它有哪些order

您可以通過在實體上包括的字段和注釋來確定關系是單向還是雙向。

單向

@Entity
public class Parent(){

    @OneToMany
    private List<Child> children;
}

@Entity
public class Child(){

}

雙向

@Entity
public class Parent(){

    @OneToMany
    private List<Child> children;
}

@Entity
public class Child(){

    @ManyToOne
    @JoinColumn
    private Parent parent;
}

如您所見, 單向關系不允許子級訪問父級,而雙向關系則允許父級訪問。 該鏈接是通過將注釋字段添加到父類型的子對象來創建的,並且是完全可選的。 它歸結為一個設計決策。

當然,數據庫必須支持該關系,這意味着將建立適當的主鍵/外鍵來鏈接表,但是數據庫中不需要任何特殊的東西。

建模這些關系時要注意的一個重要概念是擁有實體。 我寫了這篇有關該主題的文章 ,這可能會有所幫助。

那取決於你的要求

Unidirectional

@Entity
@AutoProperty
public class OneToOneUnidirectionalA implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @OneToOne
    private OneToOneUnidirectionalB b;

    private String s;

    // Setters, Getters, Constructors, Pojomatic...

}


@Entity
@AutoProperty
public class OneToOneUnidirectionalB implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    // No reference to OneToOneUnidirectionalA
    // since this is a unidirectional relationship

    private String s;

    // Setters, Getters, Constructors, Pojomatic...

}

雙向A擁有該關系。 我們還需要避免Pojomatic循環引用問題:

@Entity
@AutoProperty
public class OneToOneBidirectionalA implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @Property(policy=PojomaticPolicy.NONE)
    @OneToOne
    private OneToOneBidirectionalB b;

    // Setters, Getters, Constructors, Pojomatic...

}



@Entity
@AutoProperty
public class OneToOneBidirectionalB implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @Property(policy=PojomaticPolicy.NONE)
    @OneToOne(mappedBy="b")
    private OneToOneBidirectionalA a;

    // Setters, Getters, Constructors, Pojomatic...

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM