Question Hibernate et Scala [fermé]


J'ai joué avec Scala et je me demandais si quelqu'un avait déjà utilisé hibernate et mysql comme magasin persistant pour les objets Scala. Est-ce que ça marche ou est-ce qu'il y a beaucoup à faire?


37
2017-09-29 20:36


origine


Réponses:


La plupart du temps, Scala + Hibernate fonctionne assez bien, avec des bosses mineures qui peuvent être facilement surmontées. Par exemple, lorsque vous traitez des collections, Hibernate nécessite l'utilisation d'interfaces java.util. Mais vous pouvez importer scala.collection.jcl.Conversions._ si vous souhaitez exploiter la bibliothèque plus puissante de Scala.

Vous voudrez peut-être vérifier Frank Sommers'poster pour plus d'informations.


22
2017-09-30 03:55



Ce n'est certainement pas beaucoup de travail. Un exemple simple d'hibernation + scala peut être défini en quelques dizaines de lignes. Scala et Java peuvent être mélangés dans le même projet. En particulier, la combinaison hibernate-scala permet de combiner le framework JPA et une couche orm très flexible avec l'élégance des structures immuables et de la programmation fonctionnelle fournie par scala.

La méthode la plus simple pour expérimenter avec hibernate et scala consiste à utiliser une base de données hsqldb en mémoire via hibernate / jpa. Tout d'abord, définissons le modèle de domaine. Dans ce cas, une classe de scala annotée selon le style d'hibernation, à propos de mes copains.

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
}

Notez que la classe scala est beaucoup plus compacte que la classe java, car nous n'avons pas besoin du code getter / setter standard. Maintenant, vérifions que les modules jpa et le modèle de base de données sont chargés. Selon la spécification hibernate, ajoutons le fichier de configuration d'hibernation bien connu: resources / META-INF / persistence.xml:

<?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>

Après avoir défini la configuration de la persistance, passons au fichier scala principal:

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();

  }
}

Le code est assez simple. Une fois que le JPA EntityManager est créé via la fabrique, le modèle de données est disponible pour l'insertion, la suppression, la requête, en utilisant les méthodes définies dans la documentation de hibernate et jpa.

Cet exemple a été configuré avec sbt. Après avoir récupéré les paquets nécessaires et compilé la source, l'exécution du didacticiel produira le journal suivant:

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

16
2017-12-09 15:47



Scala Query n'est pas Hibernate mais peut être intéressant.


8
2017-10-09 01:44



Il y a des problèmes. Parce que certaines fonctionnalités de JPA exploitent les annotations imbriquées, par exemple collections, vous êtes en difficulté car Scala ne prend pas encore en charge les annotations imbriquées. Cela disparaîtra quand 2.8 sortira.

Voir Wille Faler's Blog pour plus d'informations sur ce sujet et d'autres incompatibilités.


3
2017-10-08 21:24



Notez que Scala 2.8, maintenant dans RC5 et qui devrait sortir sous peu, supporte les annotations imbriquées. La version a beaucoup d'autres fonctionnalités intéressantes.


3
2018-06-17 16:35



J'utilise l'hibernation avec Scala. Le vrai problème que je devais résoudre était de savoir comment persister les énumérations en hibernation. J'ai mis ma solution de travail sur github

Scala-énumération-hibernation

Fondamentalement, il faut définir son propre UserType

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)
    }
 }

3
2017-10-20 13:45



Je n'ai pas utilisé Hibernate avec Scala directement, mais j'utilise JPA. Hibernate fournit une implémentation JPA, et la façon dont vous définissez les classes persistantes JPA ou Hibernate n'est pas très différente, donc je pense que l'utilisation d'Hibernate sans la couche JPA est possible


2
2017-09-29 21:55



Jettes un coup d'oeil à Scala version de Play Framework où il y a une adaptation complète de JPA pour Scala.


0
2018-02-07 15:40