2017-05-19 77 views
1

的持久性表現我有兩個類:JPA:如何提高一對多關係

@Entity 
@Table(name="folder") 
public class Folder{ 
@Id 
public String reference; 
@OneToMany(cascade = {CascadeType.ALL}, orphanRemoval = true) 
public List<Client> clients= new ArrayList<>(); 
public Date createDate; 
} 

和第二類:

@Entity 
@Table(name = "client") 
public class Client implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public int id; 
    public String name; 
} 
在我的數據庫

我創建了一個intermadiate表

create table folder_clients (folder_ref varchar(20) not null, clients_id int not null) 
    alter table folder_clients add constraint UK_clientid unique (clients_id) 
    alter table folder_clients add constraint FK_idClient foreign key (clients_id) references client 
    alter table folder_clients add constraint FK_refFolder foreign key (folder_ref) references folder 

現在我有一個服務,堅持一個文件夾,所以自動它堅持所有相關的客戶,這是做throught文件夾存儲庫:

folder.getClients().add(client); 
folderRepository.save(folder); 

一切都很好,工作,但是當我執行SQL事件探查我發現它執行許多語句,從而影響性能。

有沒有更好的方法來改進我的代碼,以減少由hibernate執行的語句的數量並提高性能?

謝謝

+0

想解釋這條線是如何工作的'名單客戶=新ArrayList <>();'如果'Client'不是實際的類? – XtremeBaumer

+0

對不起,它是一個錯誤,我編輯,第二類是客戶端 – METTAIBI

+0

以及你必須插入/更新連接到該文件夾​​的每個客戶端。如果它是一個插入,你將不能減少語句的數量。爲了更新它取決於你更新什麼以及你如何確定誰更新。我認爲你錯過了一些sql理解什麼是可能的,什麼不可能 – XtremeBaumer

回答

2

有很多-to-many關聯或一個一對多在這種情況下,客戶端和文件夾之間的關聯?

如果這是一對多關聯,我建議你使用雙向映射。因爲這種情況你不需要第三張桌子。所以(簡言之),休眠會產生更少的查詢,並且性能會增加。

@Entity 
@Table(name="folder") 
public class Folder { 
    @Id 
    private String reference; 

    @OneToMany(mappedBy="folder", cascade = {CascadeType.ALL}, orphanRemoval = true) 
    private List<Client> clients= new ArrayList<>(); 

    private Date createDate; 

    //getters and setters 
} 


@Entity 
@Table(name = "client") 
public class Client implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    private String name; 

    @ManyToOne 
    @JoinColumn(name = "folder_id") 
    private Folder folder; 

    //getters and setters 
} 

查看有關@OneToMany關係,這真棒職位:https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

但是,如果你的情況是許多一對多看到:https://vladmihalcea.com/the-best-way-to-use-the-manytomany-annotation-with-jpa-and-hibernate/

+1

你不需要使雙向關係擺脫中間表,看到我上面的評論 – crizzis

+0

避免中間表是的,你是對的。但雙向增加了性能。 看到這個[鏈接](https://vladmihalcea.com/2017/03/29/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/) 而這職位是關於表現。 – adyjr

+0

你是對的,我的壞。爲了將來的參考,值得注意的是,首先插入子實體然後更新外鍵的行爲是特定於供應商的:Hibernate和EclipseLink遵循這種方法,而DataNucleus和OpenJPA不 – crizzis