THMMY.gr

Ηλεκτρονικοί Υπολογιστές και Τεχνικά Θέματα => Java => Topic started by: Issle on October 07, 2010, 02:16:55 am



Title: ScriptEngine και Hibernate.
Post by: Issle on October 07, 2010, 02:16:55 am
Το hibernate είναι ένα βοηθητικό εργαλείο που επιτρέπει την ενσωμάτωση χαρακτηριστικών ODBMS σε RDBMS βάσεις δεδομένων. Είναι εξωτερικά Jar που ενσωματώνεις στην εφαρμογή σου και χρησιμοποιούν Reflection για να διαβάσουν τις κλάσεις και να εφαρμόσουν αρχές αντικειμενοστρεφών βάσεων δεδομένων σε αυτές.

Η κλάση ScriptEngine και οι παράγωγές της επιτρέπουν την εκτέλεση και το compile σε πηγαίο κώδικα την στιγμή που τρέχει η εφαρμογή χωρίς να απαιτείται restart. Δίνεις στην ScriptEngine τον φάκελο με τα αρχεία java και με αναδρομή αυτή τα κάνει compile. Τα αρχεία δεν γίνονται Linking στην κυρίως εφαρμογή καθώς έχουν δικό τους ξεχωριστό classpath το οποίο δεν εμφανίζεται πουθενά.

Εκεί ξεκινά και το πρόβλημα. Δέν μπορώ να κάνω τα Jar του Hibernate να δούν κλάσεις που βρίσκονται στο Classpath που προκύπτει από το Compilation της ScriptEngine. Τα jar, είναι της εφαρμογής και βλέπουν το classpath της εφαρμογής και της java. Πάνε 5 μέρες τώρα που προσπαθώ χωρίς αποτέλεσμα. Γενικά γνωρίζει κανείς αν είναι δυνατόν να γίνει "Reflection" από μία εφαρμογή σε κλάσεις που έχουν γίνει compile on runtime από ScriptEngine ?


Title: Re: ScriptEngine και Hibernate.
Post by: antares on October 07, 2010, 12:14:34 pm
Το Hibernate φορτώνει τα mappings των κλάσεων κατά την εκκίνηση (ή οταν πρωτοφτιάχνεις το SessionFactory αν θέλεις). Οπότε και να ήταν ίδιο το classpath μεταξύ των 2 modules, το Hibernate δεν θα καταλάβαινε τις κλάσεις γιατί δεν θα υπήρχαν τα mappings. Αλλά και να είχες τα mappings (τα δημιουργούσες runtime), σε τι αντικείμενα στο rdbms θα έκαναν map?

To ερώτημα σχετικά με το "reflection" λύνεται με το να χρησιμοποιήσεις τον default ClassLoader και φορτώσεις τις κλάσεις δυναμικά:
Code:
ClassLoader.getSystemClassLoader().loadClass(className)


Title: Re: ScriptEngine και Hibernate.
Post by: Issle on October 07, 2010, 12:32:56 pm
Τις κλάσεις δεν μπορώ να τις φορτώσω δυναμικά όταν χρησιμοποιώ ScriptEngine για να κάνω compile γιατί βρίσκονται σε ξεχωριστό classpath και δεν δημιουργούνται .class αρχεία. Άν χρησιμοποιήσω custom class loader, θα φορτωθεί μεν η κλάση στο classpath αλλά θα είναι διαφορετική από αυτήν που προέκυψε από την ScriptEngine right ? Μία λύση σαφώς θα ήταν να μετατρέψω όλο το Project μου ώστε να φορτώνονται οι κλάσεις μέσω ενός ClassLoader η καθεμιά. Είναι στίς λύσεις ανάγκης και προσπαθώ να την αποφύγω :) Όσο για το factory, καθε φορά που κάνω recompile/reload τον κώδικα, δημιουργώ νέο factory/config και γίνονται load όλα τα mappings ( annotations έχω ) από την αρχή.


Title: Re: ScriptEngine και Hibernate.
Post by: antares on October 07, 2010, 22:24:07 pm
Εφόσον δεν έχεις class αρχεία, δεν μπορείς να χρησιμοποιήσεις τον default class loader για να φορτώσεις δυναμικά τις κλάσεις. Άρα υποχρεωτικά θα χρησιμοποιήσεις είτε τον class loader του script engine είτε ένα custom δικό σου. Μου φαίνεται ότι είναι η μόνh λύση.

Τα νέα αρχεία που κάνουν map στο rdbms?


Title: Re: ScriptEngine και Hibernate.
Post by: Issle on October 08, 2010, 00:38:59 am
Yap και εγώ κάπου εκεί κατέληξα, κρίμα όμως, java let me down ...

Όσο για τα αρχεία το mapping γίνεται με annotation από τις κλάσεις σε table της MySQL. Δεν χρησιμοποιώ xml mapping files.

πχ

@Entity
public class Employee{

@Id
private int employeeId

...
}

Δίνω την κλάση στο Hibernate το οποίο με Reflection εντοπίζει τα στοιχεία της κλάσης και την κάνει Persistant.

Quote
Τα νέα αρχεία που κάνουν map στο rdbms?

Καθότι τα αρχεία βρίσκονταί σε διαφορετικό ClassPath από αυτό της εφαρμογής ( στην οποία υπάρχουν τα Jar του Hibernate ) , welcome to ClassNotFoundException  :). Ένώ μέσα από την main() (αυτή που ξεκινά από ScriptEngine ) μπορώ να κάνω reflect.