2012-08-27 34 views
5

我有一個應用程序創建了很多引用兩個其他實體的行,即在實現ManyToOne關係的行中有兩個外鍵引用。是否有必要使用JPA和MySQL獲取實體以引用它?

這些是所引用的兩個實體:

CREATE TABLE a (
    `id` INT NOT NULL auto_increment, 
    -- lots of other attributes, 
    PRIMARY KEY (id) 
) 

CREATE TABLE b (
    `id` INT NOT NULL auto_increment, 
    -- lots of other attributes, 
    PRIMARY KEY (id) 
) 

這是引用實體A和B:

CREATE TABLE x (
    `id` INT NOT NULL auto_increment, 
    `f_a` INT NOT NULL, 
    `f_b` INT NOT NULL, 
    CONSTRAINT `FK_a` FOREIGN KEY (`f_a`) REFERENCES `a` (`id`), 
    CONSTRAINT `FK_b` FOREIGN KEY (`f_b`) REFERENCES `b` (`id`), 
) 

的a,b和x被映射到類A,B ,以及通過EclipseLink使用JPA的X,這是非常基本的,沒有什麼奇怪的。

當我在Java中創建一個X我做了以下(注意A和B已經存在,我只知道他們的標識 - 他們是從遺留應用程序feeded):

A a = entityManager.find(A.class, knownIdForA); 
B b = entityManager.find(B.class, knownIdForB); 

X x = new X(); 
x.setA(a); 
x.setB(b); 

entityManager.persist(x); 

的東西是我必須插入大約20萬個實體,這是相當多的。大約是As和Bs的3倍,所以我必須獲得200,000次A和B,最有可能是200,000個不同的A和B,所以我無法使用緩存。

我的問題是:是否真的有必要獲取整個實體?有沒有辦法降低這些成本?或者有什麼方法可以手動設置外鍵引用(可以歸結爲整數)而不會失去JPA的好處(即不必編寫我自己的查詢)?

問題的另一種表述:如何使用JPA完成以下內容?

INSERT INTO x (`f_a`, `f_b`) VALUES (13, 17); 

其中f_a和f_b是外鍵?

回答

6

您可以使用EntityManager的getReference()方法獲取「引用」實例,而不是使用find()加載實體。這些引用是懶惰地提取的,所以在你的情況下,根本不需要獲取它們。

您的代碼將類似於:

A a = entityManager.getReference(A.class, knownIdForA); 
B b = entityManager.getReference(B.class, knownIdForB); 

X x = new X(); 
x.setA(a); 
x.setB(b); 

entityManager.persist(x); 

但只有堅持()調用將訪問你的數據庫。

相關問題