Toon posts:

[Java + Hibernate + MySQL] BLOB slaat niet op in database

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende probleem.

Voor een applicatie waarmee ik reservering moet beheren is het nodig dat ik de contracten en offertes voor bepaalde reserveringen als Word document opsla in de database.

Waarom zo omslachtig, zul je je afvragen. Mijn opdrachtgever is een docent, het gaat hem dus gewoon om het principe dat ik bestanden in een database leer zetten en niet of ik in dit geval de makkelijkste weg kies.

Ik loop hierbij alleen tegen het volgende probleem: de reservering wordt in zijn geheel opgeslagen, echter het veld waarin de blob hoort te staan blijft leeg en in de binary modus is er ook in geen velden of wegen ook maar 1 enkele byte te vinden.

We werken dus met Java in combinatie met Hibernate en MySQL. Daarbij ga ik als volgt te werk:

Eerst laad ik het bestand in de applicatie en maak er een BLOB van:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        JFileChooser file = new JFileChooser();
        
        int returnVal = file.showOpenDialog(this);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
        System.out.println("You chose to open this file: " +
            file.getSelectedFile().getName());
        }
        
        File loadedFile = file.getSelectedFile();
 
        try {
            InputStream is = new FileInputStream(loadedFile);
            try {
                offer = Hibernate.createBlob(is);
                try {
                    System.out.println("Bloblength"+ offer.length());


ik heb hier de catches even weggelaten want die zijn toch neit van belang. Het komt er dus uiteindelijk op neer dat ik de output krijg:

code:
1
2
You chose to open this file: Advanced SQL.doc
Bloblength30208


vervolgens ga ik deze BLOB in een reservation-pojo zetten

code:
1
2
                Blob b = o.getOffer();
                res.setOffer(b);


variabele o is hierin een verwijzing naar t scherm waarin ik de BLOB laad. Variabele res is een verwijzing naar de pojo die de reservering in de database moet zetten. De getter en setter zeggen hoop ik genoeg

nog even een blik binnen de pojo
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Reservation {
    
    private Blob offer;
    
    public Reservation() {
    }

    public Blob getOffer() {
        return offer;
    }
   
    public void setOffer(Blob offer) {
        this.offer = offer;
    }


en de reservation.hbm.xml

code:
1
<property name="offer" column="res_offer" type="blob"/>


iemand hier verstand van?

Bij voorbaat dank

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Ik heb ook slechte ervaringen met BLOBs, dus gebruik tegenwoordig eigenlijk altijd het mapping type binary, met een Java property van het type byte[]. Dat programmeert ook fijen vind ik.

Misschien is dat een optie.

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

Topicstarter
Ok, dus als ik het goed begrijp verander ik alles waar nu Blob staat in byte[] (en natuurlijk de bewerking van de file naar een bytearray ipv een Blob) en in de hbm.xml zet ik binary ipv blob?

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Het probleem met de voorstelling van een Blob als byte array is dat deze telkens volledig in-memory genomen wordt, dus je moet even afwegen of dit een probleem voor je vormt.

Als je de byte array manier gebruikt om met blobs te werken, dien je dit in je hibernate mapping file idd aan te geven als binary.

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

-FoX- schreef op donderdag 31 mei 2007 @ 12:33:
Het probleem met de voorstelling van een Blob als byte array is dat deze telkens volledig in-memory genomen wordt, dus je moet even afwegen of dit een probleem voor je vormt.

Als je de byte array manier gebruikt om met blobs te werken, dien je dit in je hibernate mapping file idd aan te geven als binary.
Ja, dat is wel een punt idd. Je moet dan beslissen of je bij het ophalen van het object die binary gegevens interessant vindt, of dat je die alleen in specifieke gevallen nodig hebt.

Indien je de binary gegevens 9 van de 10 keer niet nodig hebt, kun je voor Blob gaan, maar ook eventueel de binary array naar een andere klasse verplaatsen waar je naar refereert. Welke optie je kiest, hangt een beetje van je design af.

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

Nou heb ik ook wat slechte ervaringen met blobs. Maar dat vloeit ook 9 van de 10 keer voort uit onwetendheid. Desalniettemin zijn er veel bugs in blob land. Bepaalde oracle versies werken bijvoorbeeld alleen mee wanneer de blob het laatste veld van de column is. Als je dus daadwerkelijke binary data in de database wil stoppen, wat ik ansich al niet zo'n strak plan vind, dan zou ik dit in een apparte tabel opnemen. Dus compleet losgekoppeld van de meta data. De blob tabel is dan niets meer dan een id en een blob kolom. Dit geeft je eenvoudig vrijheid over lazyloading en kun je met alle gemak tegen je meta data object babbelen.

  • ronaldmathies
  • Registratie: Juni 2001
  • Niet online
Heb je de optie:

hibernate.jdbc.use_streams_for_binary

op true gezet in je hibernate configuratie? dit kan ook schelen.

3015 Wp-z 5360 Wp-nno op 2 x SMA-SB3600 TL-21, Warmtepomp: ERSC-VM2CR2 / PUHZ-SHW140 YHA, WTW Q350, EV Kia Ev6 GT-Line


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

ronaldmathies schreef op vrijdag 01 juni 2007 @ 16:30:
Heb je de optie:

hibernate.jdbc.use_streams_for_binary

op true gezet in je hibernate configuratie? dit kan ook schelen.
Hmm, jammer dat het met de thin driver niet werkt. :'(

Fat Pizza's pizza, they are big and they are cheezy

Pagina: 1