2009-09-29 15 views
37

मैं स्कैला के साथ टकरा रहा हूं और मैं सोच रहा था कि क्या किसी को स्केल ऑब्जेक्ट्स के लिए लगातार स्टोर के रूप में हाइबरनेट और माइस्क्ल का उपयोग करने का कोई अनुभव था? क्या यह बॉक्स से बाहर काम करता है या क्या करने के लिए बहुत कुछ है?हाइबरनेट और स्कैला

उत्तर

22

अधिकांश समय, स्कैला + हाइबरनेट अच्छी तरह से काम करता है मामूली टक्कर जो आसानी से दूर किया जा सकता है। Exmaple के लिए, संग्रह से निपटने के दौरान, Hibernate java.util इंटरफेस के उपयोग की आवश्यकता है। लेकिन यदि आप स्कैला की अधिक शक्तिशाली लाइब्रेरी पर टैप करना चाहते हैं तो आप scala.collection.jcl.Conversions._ आयात कर सकते हैं।

आप अधिक जानकारी के लिए Frank Sommers 'पोस्ट देखना चाहते हैं।

+2

_Note को परिभाषित करने की जरूरत है: _ में स्केला 2.8 '' scala.collection.jcl.Conversions' ले जाया गया था scala.collection.JavaConversions'। तो आपको स्केल 2.8+ में 'import scala.collection.JavaConversions._' का उपयोग करना चाहिए। डॉक्स: http://www.scala-lang.org/api/current/scala/collection/JavaConversions$.html। –

+0

ध्यान दें कि गणना स्कैला और हाइबरनेट के साथ एक प्रकार का दर्द है, लेकिन उन्हें लागू करना संभव है। हालांकि आश्चर्यजनक रूप से जावा में यह आसान है। – wmacura

2

मैंने सीधे स्केल के साथ हाइबरनेट का उपयोग नहीं किया है, लेकिन मैं जेपीए का उपयोग कर रहा हूं। हाइबरनेट एक जेपीए कार्यान्वयन प्रदान करता है, और जिस तरह से आप जेपीए लगातार कक्षाओं या हाइबरनेट को परिभाषित करते हैं, वह बहुत अलग नहीं है, इसलिए मुझे लगता है कि जेपीए परत के बिना हाइबरनेट का उपयोग करना संभव है

3

समस्याएं हैं। चूंकि जेपीए की कुछ विशेषताएं नेस्टेड एनोटेशन का लाभ उठाया है, उदाहरण के लिए संग्रह, आप परेशानी में हैं क्योंकि स्कैला ने अभी तक नेस्टेड एनोटेशन का समर्थन नहीं किया है। 2.8 बाहर आने पर वह चलेगा।

इस विषय और अन्य असंगतताओं पर अधिक के लिए Wille Faler’s Blog देखें।

3

ध्यान दें कि स्काला 2.8, RC5 में अब और शीघ्र ही जारी करने के लिए उम्मीद, नेस्टेड एनोटेशन का समर्थन करता है। रिलीज में कई अन्य शानदार विशेषताएं भी हैं।

16

यह निश्चित रूप से बहुत काम नहीं है। एक साधारण हाइबरनेट + स्कैला उदाहरण को कुछ दशकों में परिभाषित किया जा सकता है। स्कैला और जावा को उसी प्रोजेक्ट में मिश्रित किया जा सकता है। विशेष रूप से, हाइबरनेट-स्कैला संयोजन जेपीए ढांचे को जोड़ना और स्केल द्वारा प्रदान की जाने वाली अपरिवर्तनीय संरचनाओं और कार्यात्मक प्रोग्रामिंग के लालित्य के साथ एक बहुत ही लचीला ऑर्म परत संभव बनाता है।

हाइबरनेट और स्कैला के साथ प्रयोग करने का सबसे आसान तरीका है हाइबरनेट/जेपीए के माध्यम से एक इन-मेमोरी hsqldb डेटाबेस का उपयोग करना। सबसे पहले, डोमेन मॉडल को परिभाषित करते हैं। इस मामले में, मेरे दोस्तों के बारे में, हाइबरनेट शैली के अनुसार एक स्कैला वर्ग एनोटेटेड।

package nl.busa.jpa 
import javax.persistence._ 

@Entity 
@Table(name = "buddy") 
class Buddy(first: String, last: String) { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    var id: Int = _ 

    var firstName: String = first 
    var lastName: String = last 

    def this() = this (null, null) 

    override def toString = id + " = " + firstName + " " + lastName 
} 

नोट कैसे स्केला वर्ग, क्योंकि हम ठेठ गेटर/सेटर बॉयलरप्लेट कोड की जरूरत नहीं है, बहुत जावा वर्ग की तुलना में अधिक कॉम्पैक्ट है। अब आइए सुनिश्चित करें कि जेपीए मॉड्यूल और डेटाबेस मॉडल लोड हो गया है।

package nl.busa.jpa 

import javax.persistence.EntityManager 
import javax.persistence.EntityManagerFactory 
import javax.persistence.Persistence 

import scala.collection.JavaConversions._ 

object HibernateJpaScalaTutorial  { 

    var entityManagerFactory: EntityManagerFactory = Persistence.createEntityManagerFactory("nl.busa.jpa.HibernateJpaScalaTutorial") 
    var entityManager: EntityManager = entityManagerFactory.createEntityManager() 

    def main(args : Array[String]) { 

    entityManager.getTransaction().begin() 
    entityManager.persist(new Buddy("Natalino", "Busa")) 
    entityManager.persist(new Buddy("Angelina", "Jolie")) 
    entityManager.persist(new Buddy("Kate", "Moss")) 
    entityManager.getTransaction().commit() 

    entityManager.getTransaction().begin(); 
    val allBuddies = entityManager.createQuery("From Buddy", classOf[Buddy]).getResultList.toList 
    entityManager.getTransaction().commit(); 

    allBuddies foreach println 

    entityManager.close(); 

    } 
} 
: के मुख्य स्केला फ़ाइल पर बढ़ते हैं,

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
     version="2.0"> 
    <persistence-unit name="nl.busa.jpa.HibernateJpaScalaTutorial"> 
     <description> 
     Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide 
     </description> 
     <class>nl.busa.jpa.HibernateJpaScalaTutorial</class> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:JpaScala"/> 
      <property name="hibernate.show_sql" value="false"/> 
      <property name="hibernate.hbm2ddl.auto" value="create"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

दृढता विन्यास परिभाषित करने के बाद: हाइबरनेट विनिर्देश के अनुसार, की प्रसिद्ध हाइबरनेट विन्यास फाइल जोड़ने: संसाधनों/META-INF/persistence.xml

कोड काफी सरल है।एक बार जेपीए EntityManager कारखाने के माध्यम से बनाया गया है, डेटा मॉडल हाइबरनेट और जेपीए के दस्तावेज में परिभाषित तरीकों का उपयोग करके सम्मिलन, हटाने, क्वेरी के लिए उपलब्ध है।

यह उदाहरण एसबीटी का उपयोग करके स्थापित किया गया है।

HibernateJpaScalaTutorial:-:1.0.0> run 
[info] Running nl.busa.jpa.HibernateJpaScalaTutorial 
1 = Natalino Busa 
2 = Angelina Jolie 
3 = Kate Moss 
[success] Total time: 4 s, completed Dec 9, 2012 4:18:00 PM 
3

मैं स्काला साथ हाइबरनेट उपयोग कर रहा हूँ: आवश्यक संकुल पुन: प्राप्त करने, और स्रोत संकलन के बाद, ट्यूटोरियल चल निम्नलिखित लॉग का उत्पादन करेगा। वास्तविक समस्या जिसे मुझे हल करना था, हाइबरनेट में गणनाओं को कैसे बनाए रखना था। मैं GitHub पर मेरे कार्य समाधान डाल दिया

Scala-enumeration-hibernate

मूल रूप से एक खुद प्रयोक्ता प्रकार

abstract class EnumerationAbstractUserType(val et: Enumeration) extends UserType { 
    .... 
    override def nullSafeGet(resultSet: ResultSet, names: Array[String], session: SessionImplementor, owner: Object): Object = { 
    val value = resultSet.getString(names(0)) 
    if (resultSet.wasNull()) null 
    else et.withName(value) 
    } 

    override def nullSafeSet(statement: PreparedStatement, value: Object, index: Int, session: SessionImplementor): Unit = { 
    if (value == null) { 
     statement.setNull(index, Types.VARCHAR) 
    } else { 
     val en = value.toString 
     statement.setString(index, en) 
    } 
} 
संबंधित मुद्दे