Hi lnader!
I've tried the SqlArray and ListAsSQLArrayUserType way, but I wasn't able... so I mapped my float[] as a bytea (it works even with int[] :-)
Here is my code:
Star.java
Code:
package popolamento;
/**
* Classe Spectra.
*
* Rappresentazione di spettri stellari sintetici
* che copre un vasto spazio di parametri fisici
* (temperatura, gravità superficiale, velocità
* di rotazione, etc) e non (risoluzione, normalizzazione, etc).
*/
public class Spectra {
private Long id;
private String teff;
private int logg;
private String feh;
private int vrot;
private int k;
private String alpha;
private String odf;
private String res;
private String tipo;
private float[] data;
/**
* Costruttore di spettro vuoto
*/
public Spectra() {}
/**
* Accede all'attributo.
*
* @return <code>long</code> il valore del campo
*/
public Long getId() {
return id;
}
/**
* Modifica l'attributo.
*
* @param id il valore da dare al campo
*/
private void setId(Long id) {
this.id = id;
}
/**
* Accede alla temperatura effettiva.
*
* @return <code>String</code> il valore del campo
*/
public String getTeff() {
return teff;
}
/**
* Modifica la temperatura effettiva.
*
* @param teff il valore da dare al campo
*/
public void setTeff(String teff) {
this.teff = teff;
}
/**
* Accede alla gravità superficiale.
*
* @return <code>int</code> il valore del campo
*/
public int getLogg() {
return logg;
}
/**
* Modifica la gravità superficiale.
*
* @param logg il valore da dare al campo
*/
public void setLogg(int logg) {
this.logg = logg;
}
/**
* Accede alla metallicità.
*
* @return <code>String</code> il valore del campo
*/
public String getFeh() {
return feh;
}
/**
* Modifica la metallicità.
*
* @param feh il valore da dare al campo
*/
public void setFeh(String feh) {
this.feh = feh;
}
/**
* Accede alla velocità rotazionale.
*
* @return <code>int</code> il valore del campo
*/
public int getVrot() {
return vrot;
}
/**
* Modifica la velocità rotazionale.
*
* @param vrot il valore da dare al campo
*/
public void setVrot(int vrot) {
this.vrot = vrot;
}
/**
* Accede alla microturbulent velocity.
*
* @return <code>int</code> il valore del campo
*/
public int getK() {
return k;
}
/**
* Modifica la microturbulent velocity.
*
* @param k il valore da dare al campo
*/
public void setK(int k) {
this.k = k;
}
/**
* Accede all'enhancement.
*
* @return <code>String</code> il valore del campo
*/
public String getAlpha() {
return alpha;
}
/**
* Modifica l'enhancement.
*
* @param alpha il valore da dare al campo
*/
public void setAlpha(String alpha) {
this.alpha = alpha;
}
/**
* Accede al modello ODF.
*
* @return <code>String</code> il valore del campo
*/
public String getOdf() {
return odf;
}
/**
* Modifica il modello ODF.
*
* @param odf il valore da dare al campo
*/
public void setOdf(String odf) {
this.odf = odf;
}
/**
* Accede alla risoluzione.
*
* @return <code>String</code> il valore del campo
*/
public String getRes() {
return res;
}
/**
* Modifica la risoluzione.
*
* @param res il valore da dare al campo
*/
public void setRes(String res) {
this.res = res;
}
/**
* Accede al tipo (fluxed o normalized).
*
* @return <code>String</code> il valore del campo
*/
public String getTipo() {
return tipo;
}
/**
* Modifica il tipo (fluxed o normalized).
*
* @param tipo il valore da dare al campo
*/
public void setTipo(String tipo) {
this.tipo = tipo;
}
/**
* Accede ai dati.
*
* @return <code>float[]</code> il valore del campo
*/
public float[] getData() {
return data;
}
/**
* Modifica i dati.
*
* @param data il valore da dare al campo
*/
public void setData(float[] data) {
this.data = data;
}
}
Star.hbm.xmlCode:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="popolamento.Spectra" table="SPECTRA">
<id name="id" column="ID">
<generator class="native"/>
</id>
<property name="teff">
<column name="TEFF" sql-type="CHAR(5)"/>
</property>
<property name="logg">
<column name="LOGG" sql-type="SMALLINT"/>
</property>
<property name="feh">
<column name="FEH" sql-type="CHAR(4)"/>
</property>
<property name="vrot">
<column name="VROT" sql-type="SMALLINT"/>
</property>
<property name="k">
<column name="K" sql-type="SMALLINT"/>
</property>
<property name="alpha">
<column name="ALPHA" sql-type="CHAR(1)"/>
</property>
<property name="odf">
<column name="ODF" sql-type="CHAR(2)"/>
</property>
<property name="res">
<column name="RES" sql-type="CHAR(3)"/>
</property>
<property name="tipo">
<column name="TIPO" sql-type="CHAR(1)"/>
</property>
<property name="data"/>
</class>
</hibernate-mapping>
SpectraLoader.javaCode:
package popolamento;
import java.io.*;
import java.util.zip.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;
/**
* Classe SpectraLoader.
*
* Carica in un database tutti i file trovati, a partire dalla posizione
* attuale o dalla cartella indicata, il cui nome soddisfi la seguente codifica:
* T([0-9]{5})G([0-5]{2})([MP])([0125]{2})V([0123457]{3})K([124])([SA])(NW|OD)NV(R20|RVS|RAV|SLN|D01|D10)[NF].ASC.gz
*
* @see popolamento.DirBrowser
*/
public class SpectraLoader {
public static void main(String[] args) {
SpectraLoader spl = new SpectraLoader();
// se non viene passato nessun percorso, parte dalla cartella di lavoro
File f = new File(".");
if (args.length!=0 && !args[0].equals("${action}"))
f = new File(args[0]);
// scansione delle cartelle dirBrowser(f, spl);
DirBrowser.subfolder(f, spl);
HibernateUtil.getSessionFactory().close();
}
/**
* Crea e salva uno spettro nel database.
*
* @param f file da caricare
* @exception IOException se il file non viene trovato
* @exception HibernateException se si perde la connessione al database
*/
protected void createAndStoreSpectra(File f) {
// dal nome del file risale alle caratteristiche
String nome = f.getName();
nome = nome.toUpperCase();
String teff = nome.substring(1,6);
String logg = nome.substring(7,9);
String segno = "+";
if (nome.substring(9,10).equals("M"))
segno = "-";
String feh = segno + nome.charAt(10) + "." + nome.charAt(11);
String vrot = nome.substring(13,16);
String k = "" + nome.charAt(17);
String alpha = "" + nome.charAt(18);
String odf = nome.substring(19,21);
String res = nome.substring(23,26);
String tipo = "" + nome.charAt(26);
float[] data = null;
try { // apre il file compresso e conta le righe
String inFilename = f.getCanonicalPath();
BufferedReader gzipReader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(inFilename))));
String linea = gzipReader.readLine();
int j = 0;
while(linea!=null) {
linea = gzipReader.readLine();
j++;
}
// mette il contenuto dentro un array
data = new float[j];
gzipReader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(inFilename))));
linea = gzipReader.readLine();
j = 0;
while(linea!=null) {
data[j] = Float.valueOf(linea).floatValue();
linea = gzipReader.readLine();
j++;
}
gzipReader.close(); // chiude il file gzip
} catch (IOException e) {
System.out.println("ERRORE! " + e);
}
// carica nel database
Transaction tx = null;
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
try {
tx = session.beginTransaction();
Spectra spectrum = new Spectra();
spectrum.setTeff(teff);
spectrum.setLogg(Integer.parseInt(logg));
spectrum.setFeh(feh);
spectrum.setVrot(Integer.parseInt(vrot));
spectrum.setK(Integer.parseInt(k));
spectrum.setAlpha(alpha);
spectrum.setOdf(odf);
spectrum.setRes(res);
spectrum.setTipo(tipo);
spectrum.setData(data);
session.save(spectrum);
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
if (tx != null && tx.isActive())
tx.rollback();
}
}
}
SpectraView.javaCode:
package popolamento;
import java.util.List;
import org.hibernate.Session;
import util.HibernateUtilView;
/**
* Classe SpectraLoader.
*
* Accede al database e recupera tutti gli spettri inseriti,
* stampandone a video i parametri.
*/
public class SpectraView {
public static void main(String[] args) {
SpectraView spw = new SpectraView();
// recupera gli spettri nel database
List splist = spw.listSpectra();
// stampa a video le caratteristiche e i dati
for (int i = 0; i < splist.size(); i++) {
Spectra spectrum = (Spectra) splist.get(i);
float[] data = spectrum.getData();
System.out.println("Teff = "+spectrum.getTeff());
System.out.println("Logg = "+spectrum.getLogg());
System.out.println("Fe_H = "+spectrum.getFeh());
System.out.println("VRot = "+spectrum.getVrot());
System.out.println("K = "+spectrum.getK());
System.out.println("Alpha = "+spectrum.getAlpha());
System.out.println("ODF = "+spectrum.getOdf());
System.out.println("Res = "+spectrum.getRes());
System.out.println("Tipo = "+spectrum.getTipo());
System.out.println("Data =");
for (int j = 0; j < data.length; j++)
System.out.println(data[j]);
System.out.println("-----*****-----*****-----");
}
HibernateUtilView.getSessionFactory().close();
}
/**
* Interroga il database e recupera un oggetto List contenente tutte
* le tuple presenti.
*
* @return <code>List</code> lista degli spettri presenti nel database
*/
private List listSpectra() {
// estrae una lista delle tuple presenti nel database
Session session = HibernateUtilView.getSessionFactory().getCurrentSession();
session.beginTransaction();
List result = session.createQuery("from Spectra").list();
session.getTransaction().commit();
return result;
}
}
PS: please don't forget to give credits below if you found this answer useful :)