/ GAE - java, google-app-engine, jpa, transaction, google-cloud-datastore पर कई संस्थाओं को पुनः प्राप्त / रिकॉर्ड करने का सबसे सस्ता तरीका

GAE - जावा, google-app-engine, jpa, लेन-देन, google-cloud-datastore पर एकाधिक इकाइयों को पुनर्प्राप्त / रिकॉर्ड करने का सबसे अच्छा तरीका

मेरे पास यह विशिष्ट मामला है जो मुझे कुछ संदेह लाता है: मेरी कक्षा ए में बी के साथ एक-से-कई संबंध हैं:

A  1----->*  B

जो, जहाँ तक मुझे पता है, उनका संबंध बनाता हैउदाहरण एक ही इकाई समूह के हैं। मुझे एक विशेष A उदाहरण और उसके B में से एक को पुनः प्राप्त करना है, इसलिए मैं A को खोजता हूं और विशेष B को खोजने के लिए अपनी B सूची के माध्यम से पुनरावृति करता हूं (हमेशा Id द्वारा खोजता हूं)। उसके बाद, मैं A और B की एक विशेषता को बदलता हूं और A को विलय करके अपना परिवर्तन करता हूं। इसलिए यहां मेरे प्रश्न हैं:

  1. यह जानकर कि मुझे A और B को पुनः प्राप्त करना होगा (क्योंकि मुझे दोनों को संशोधित करना होगा), क्या मुझे B सूची को पुन: प्रदर्शित करने के बजाय 2 खोज करनी चाहिए?
  2. 2 खोज करने पर, B पर संशोधन जारी रहेगा यदि मैं केवल A को जारी रखूं?
  3. प्रश्न 1 और 2 का इस मामले में एक ही उत्तर होगा:
A  1----->*  C  1----->*  B

कुछ कोड के साथ प्रश्न को लागू करना:

@Entity
public class A
{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;

private int aField;

@OneToMany(cascade={CascadeType.ALL})
private List<B> bList;

//...
}

@Entity
public class B
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;

private int someBField;

// no way to get A from here...

//...
}

public void someService1(Key aKey, Key bKey)
{
//...

// Here, I"m sure that bKey is of an entity son of aKey entity (I trust the client)
A a = entityManager.find(A.class, aKey);
a.setAField(a.getAField()++);

for(B b : a.getBList())
if(b.getKey().equals(bKey))
b.setSomeBField(b.getSomeBField()++);

entityManager.merge(a);

//...
}

public void someService2(Key aKey, Key bKey)
{
//...

// Here, I"m sure that bKey is of an entity son of aKey entity (I trust the client)
A a = entityManager.find(A.class, aKey);
a.setAField(a.getAField()++);

B b = entityManager.find(B.class, bKey);
b.setSomeBField(b.getSomeBField()++);

entityManager.merge(a);

//...
}

वैसे, someService1 और someService2 दोनों एक ही काम करते हैं, अगर मैंने सब कुछ सही किया। इनमे से कौन बेहतर है?

उत्तर:

उत्तर № 1 के लिए 1

यदि आप आईडी जानते हैं (और आप कहते हैं कि आप आईडी द्वारा खोज रहे हैं) तो बस एक करें em.find ए के लिए, और em.find B. दो कॉल के लिए। अफसोस की बात है कि जेपीए एपीआई के पास ए नहीं है em.findAll। दूसरी ओर, JDO के पास है pm.getObjectsById


जवाब के लिए 2 № 2

अगर मैं सही ढंग से समझ गया तो आपको किसी भी चीज़ के माध्यम से पुनरावृति नहीं करनी है, लेकिन इसके बजाय उपयोग करें filter() किसी पे Query तुम्हे पसंद है। उदाहरण (पायथन):

query.filter("height >", 42).filter("city = ", "Seattle")

query.filter("user = ", users.get_current_user())

यदि आप "जावा का उपयोग कर रहे हैं तो आप" का उपयोग करेंगे addFilter आपके प्रश्नों पर (और जानकारी)।