मैं हाइबरनेट/HQL सीखने की प्रक्रिया में अब भी कर रहा हूँ और मैं एक सवाल आधा सर्वोत्तम प्रथाओं प्रश्न/आधा मानसिक स्वास्थ्य की जांच है कि है।हाइबरनेट स्तंभ विशिष्टता सवाल
चलो कहते हैं कि मैं एक वर्ग एक करते हैं:
@Entity
public class A
{
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(unique=true)
private String name = "";
//getters, setters, etc. omitted for brevity
}
मैं लागू करने के लिए है कि एक सहेजा जाता है कि के प्रत्येक उदाहरण के लिए विशिष्ट नाम (इसलिए @Column एनोटेशन) है चाहता हूँ, लेकिन मैं भी सक्षम होना चाहते हैं उस मामले को संभालने के लिए जहां पहले से ही एक उदाहरण सहेजा गया है जिसमें वह नाम है। मुझे ऐसा करने के दो तरीके दिखाई देते हैं:
1) मैं org.hibernate.exception.ConstraintViolationException को पकड़ सकता हूं जिसे session.saveOrUpdate() कॉल के दौरान फेंक दिया जा सकता है और इसे संभालने का प्रयास करें।
2) मैं मौजूदा एक के उदाहरण कि पहले से ही डीएओ में उस नाम है session.saveOrUpdate कॉल करने से पहले के लिए क्वेरी कर सकते हैं()।
अभी मैं दृष्टिकोण 2 की ओर झुका रहा हूं, क्योंकि दृष्टिकोण 1 में मुझे नहीं पता कि प्रोग्रामिंग के तरीके को किस प्रकार बाधा का उल्लंघन किया गया था (ए में कुछ अन्य अद्वितीय सदस्य हैं)। अभी मेरी DAO.save() कोड मोटे तौर पर इस तरह दिखता है:
public void save(A a) throws DataAccessException, NonUniqueNameException
{
Session session = sessionFactory.getCurrentSession();
try
{
session.beginTransaction();
Query query = null;
//if id isn't null, make sure we don't count this object as a duplicate
if(obj.getId() == null)
{
query = session.createQuery("select count(a) from A a where a.name = :name").setParameter("name", obj.getName());
}
else
{
query = session.createQuery("select count(a) from A a where a.name = :name " +
"and a.id != :id").setParameter("name", obj.getName()).setParameter("name", obj.getName());
}
Long numNameDuplicates = (Long)query.uniqueResult();
if(numNameDuplicates > 0)
throw new NonUniqueNameException();
session.saveOrUpdate(a);
session.getTransaction().commit();
}
catch(RuntimeException e)
{
session.getTransaction().rollback();
throw new DataAccessException(e); //my own class
}
}
मैं सही तरीके से इस बारे में जा रहा हूँ? मुझे प्रोग्राम के रूप में बता (अर्थात एक त्रुटि स्ट्रिंग के रूप में नहीं) जो मूल्य विशिष्टता बाधा उल्लंघन कर रहा है हाइबरनेट कर सकते हैं? क्वेरी को प्रतिबद्ध से अलग करके, क्या मैं थ्रेड-सुरक्षा त्रुटियों को आमंत्रित कर रहा हूं, या क्या मैं सुरक्षित हूं? यह आमतौर पर कैसे किया जाता है?
धन्यवाद!
क्या मेरे पास दूसरे दृष्टिकोण के साथ कोई थ्रेड सुरक्षा समस्या होगी? जहां तक मैं समझता हूं, एसीआईडी डीबी सिद्धांतों का "अलगाव" हिस्सा मुझे यहां मदद करने के लिए माना जाता है, लेकिन मुझे यकीन नहीं है कि इसके साथ कितना अनुपालन हाइबरनेट/hsqldb है। – Seth
मुझे समझ में नहीं आता कि इस मामले के लिए अलगाव क्यों महत्वपूर्ण है। परीक्षण करना यदि एक नाम मौजूद है तो एक ही लेनदेन में होता है और डेटाबेस में डेटा की स्थिति में परिवर्तन नहीं करता है। – Rachel