flosy.info | Développement Web, Open source …

TAG | Spring

Sep/11

7

Projet Spring avec SQL Server

Ce post décrit les différentes étapes suivies pour connecter un projet Spring au travers d’Hibernate à une BDD SQL Server. Il s’agit d’une première aussi je suis très intéressé par tout retour.

Installation du driver

Après avoir téléchargé et décompressé le fichier (disponible ici), se placer dans le dossier qui contient le JAR.
La commande suivante permet d’ajouter le JAR au dépôt Maven local.

mvn install:install-file -Dfile=sqljdbc4.jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=3.0 -Dpackaging=JAR

Nous pouvons maintenant ajouter la dépendance suivante dans le pom.xml.

 <dependency>
  <groupid>com.microsoft.sqlserver</groupid>
  <artifactid>sqljdbc4</artifactid>
  <version>3.0</version>
 </dependency>

Configuration de SQL Server Express

Pour cet exemple nous utilisons SQLServer Express 2008. Suite à l’installation le connexion TCP/IP n’était pas disponible. Pour l’activer il convient de passer par le gestionnaire de configuration SQL Server (Sql Server Configuration Manager) .

Un clic droit sur TCP/IP donne accès à propriétés. Dans l’onglet Protocole, vérifiez que la ligne Activé est à Oui.

Dans l’onglet Adresses IP vérifiez que celle utilisée est activée. Vérifiez également que l’entrée IPALL précise le port TCP 1433.

Configuration de Hibernate

Dans la configuration suivante nous avons utilisé le compte administrateur défini dans SQL Server Express et le schéma par défaut dbo.

  <hibernate -configuration>
    <session -factory>
        <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="hibernate.connection.url">jdbc:sqlserver://127.0.0.1;databaseName=myDatabase</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password">myPassword</property>
        <property name="hibernate.default_schema">dbo</property>
        <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
 
        <!-- Log -->
        <mapping class="info.flosy.global.model.Log"/>
 
    </session>
  </hibernate>

Définition du modèle

Table associée

CREATE TABLE [dbo].[log](
	[ID] [INT] IDENTITY(1,1) NOT NULL,
	[ADD_AT] [datetime] NULL,
	[message] [nvarchar](4000) NULL,
 CONSTRAINT [PK_log] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
GO

Nous avons choisi d’utiliser une clé primaire auto-incrémentée. Ceci implique l’utilisation de l’annotation @GeneratedValue(strategy=GenerationType.IDENTITY).

Sans cette annotation nous obtenons l’erreur suivante :

WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 544, SQLState: S0001
ERROR: org.hibernate.util.JDBCExceptionReporter - Impossible d'insérer une valeur explicite dans la colonne identité de la table 'log' quand IDENTITY_INSERT est défini à OFF.
ERROR: org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
package info.flosy.global.model;
 
import java.util.Date;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
 
/**
* Log generated by hbm2java
*/
@Entity
@Table(name = "log", catalog = "myDatabase")
public class Log implements java.io.Serializable {
 
	private int id;
	private Date addAt;
	private String message;
 
	public Log() {
	}
 
	public Log(int id) {
		this.id = id;
	}
 
	public Log(int id, Date addAt, String message) {
		this.id = id;
		this.addAt = addAt;
		this.message = message;
	}
 
	@Id
	@Column(name = "ID", unique = true, nullable = false)
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public int getId() {
		return this.id;
	}
 
	public void setId(int id) {
		this.id = id;
	}
 
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "ADD_AT", length = 23)
	public Date getAddAt() {
		return this.addAt;
	}
 
	public void setAddAt(Date addAt) {
		this.addAt = addAt;
	}
 
	@Column(name = "MESSAGE")
	public String getMessage() {
		return this.message;
	}
 
	public void setMessage(String message) {
		this.message = message;
	}
}

Related Posts:

  • No Related Posts

· ·

Theme Design by devolux.nh2.me