2016-03-08 60 views
0

我與註釋應該設置怎樣我JPA實體類和去掙扎,其中如何設置JPA實體類?

我有以下表格:

Table Customer { 
    id: primary key, 
    name 
} 

Table CustomerDimension { 
    id: primary key, foreign key(Customer.id), 
    detail 
} 

目前,我有以下實體類:

public class Customer { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private long id; 
    @Column(name = "name") 
    private String name; 
    @OneToOne 
    private CustomerDimension customerDimension; 
} 

public class CustomerDimension { 
    // ? what is meant to go here? 
    private long id; 
    @Column(name = "detail") 
    private String detail; 
} 

爲了讓我插入一個擁有新CustomerDimension的新客戶,需要註釋CustomerDimension.id

應該CustomerDimension也有參考回Customer

+0

只是把'@ Id',因爲你有一個單向關係 – Ramanlfc

+0

@Ramanlfc-不是一個雙向關係,我可以從CustomerDimension - > Customer,反之亦然? – Cheetah

+0

您還需要在兩個類上添加註釋'@ Entity'和'@ Table'。 –

回答

0
Table Customer { 
    id: primary key, 
    name 
} 

Table CustomerDimension { 
    id: primary key, 
    foreign key(Customer.id), 
    detail 
} 

CustomerDimension是擁有方。這樣,@OneToOne映射應該像

public class Customer { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private long id; 
    @Column(name = "name") 
    private String name; 
} 

public class CustomerDimension { 
    @Id 
    private long id; 
    @Column(name = "detail") 
    private String detail; 

    @OneToOne 
    private Customer customer; 
} 
0

您有以下問題:

  • 客戶和CustomerDimension需要註釋@Entity
  • 在您的DDL中,表CustomerDimensionCustomer上有一個外鍵。因此,@OneToOne關係應該在CustomerDimension的一邊聲明。
  • 仍然在DDL中,您的外鍵沒有明確的名稱。我將假定它是customer_id並用它來聲明@JoinColumn(請參閱下面)
  • @Column只有當您需要該列的名稱與該屬性的名稱不同時才需要註釋(但爲了清楚起見,您可以保留它們) 。

這是我如何映射它。

@Entity 
@Table(name = "Customer") //Optional 
public class Customer { 

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

    @Column(name = "name") //Optional 
    private String name; 
} 

而對於CustomerDimension

@Entity 
@Table(name = "CustomerDimension") //Optional 
public class CustomerDimension { 

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

    @Column(name = "detail") //Optional 
    private String detail; 

    @OneToOne 
    @JoinColumn(name = "customer_id") //NOT optional 
    private Customer customer 
} 

EDIT(回答您的評論):

如果你真的想你FK是主鍵,你可以做這樣的:

@Entity 
@Table(name = "CustomerDimension") //Optional 
public class CustomerDimension { 

    @Column(name = "detail") //Optional 
    private String detail; 

    @Id 
    @OneToOne 
    @JoinColumn(name = "id") //NOT optional 
    private Customer customer 
} 

我還想知道爲什麼你不把所有的信息放在同一張表中。它會爲你節省一個SQL連接。

+0

我覺得我可能已經給表錯誤的表定義。 「客戶」是根對象(如果你喜歡,則是上下文/主題)。 'CustomerDimension'只是'Customer'的額外信息,所以我期望從'Customer'實體到達CustomerDimension實體。另外,不會生成'CustomerDimension.id'。它應該和引用的Customer.id一樣。 '客戶'是生成編號爲 – Cheetah

+0

@ Cheetah的實體,那麼你可以將FK定義爲PK,但它似乎是一個奇怪的用例。編輯答案。 –

+0

它是一個單獨的表格,因爲「CustomerDimension」記錄非常龐大並且並不總是必需的。 – Cheetah

0

你在這裏是一個OneToMany與外鍵而不是連接表的雙向關係。供應商似乎喜歡連接表,但是沒關係。

因此,您有一個CustomerDimensions的列表(或設置)Customer,但設置的值爲mappedBy

public class Customer { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private long id; 
    @Column(name = "name") 
    private String name; 

    @OneToMany(mappedBy="customer") 
    List<CustomerDimensions> dimensions; 
} 

public class CustomerDimension { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private long id; 
    @Column(name = "detail") 
    private String detail; 

    @ManyToOne 
    Customer customer; 

} 

這是自然的,Customers有一組尺寸。由於具有bidirectional映射,如果你有一個維度,然後你可以看一下顧客易(只是參考客戶領域)

編輯:既然CustomerDimension表有Customer ID參考,您可以選擇許多CustomerDimensionsCustomer,因此有OneToMany的關係。爲了設置CustomerDimension.customer_id字段,只需在Customers維列表中輸入CustomerDimension即可。

+0

它實際上是一對一的映射,所以客戶只有一個維度。但它是雙向的,但我不明白的是,沒有關於'CustomerDimension.id'的註解......這個值如何填充? – Cheetah

+0

是什麼讓你覺得它是OnToOne?您需要CustomerDimension.id上的典型ID註釋。我把它們遺漏了,因爲你做到了。查看修改。 –