RMI und Hibernate

Hallo,

im Rahmen meines Studiums muss ich ein Programm schreiben in dem sich ein Client mit einem Server verbindet (mit RMI) sich entsprechende Objekte holt (Remote zugriff, also ändere ich den zustand des Objektes auf dem Client ist er auch auf dem Server geändert). Die Objekte sollen vom Server in und aus einer Datenbank geladen werden (mittels Hibernate).

Ich habe in dem Bereich keine Vorerfahrung und einfach mal drauf los probiert.
Jetzt komm ich aber garnicht weiter und ich bin mir nicht sicher ob ich mit diesem Ansatz in die ganz falsche Richtung laufe.
Das Problem ist, Instanziere ich ein Objekt auf dem Server ohne Hibernate(new Object) funktioniert der Remote zugriff, mit Hibernate nicht. Hierzu ist zusagen das nur der Zugriff auf eine Collection innerhalb des Objektes Probleme macht.

hier der Code:

Auf diese Klasse soll Remote zugegriffen werden (liegt auf Server, auf Client entsprechendes Interface names Department)

@Entity  (name="DEPARTMENT")
public class DepartmentImpl extends UnicastRemoteObject implements Department
{
    
    
    public DepartmentImpl() throws RemoteException
    {
        super();
    }
 
    
    
    @Id 
    private int abteilungsNr;
    private String name;
    private String beschreibung;
    private String anschrift;
    private int plz;
    private String standort;
    
    
    
 
 
@ElementCollection (fetch=FetchType.EAGER)  //extra auf EAER gestellt damit Hibernate nicht nachladen muss
@JoinTable (name="Employee",                // tabellen name auf Employee geändert
    joinColumns=@JoinColumn (name="Deptno")) 
@GenericGenerator (name="hilo-gen", strategy="seqhilo")
 @CollectionId(columns = { @Column(name="Emp_ID") }, generator = "hilo-gen", type = @Type(type="long"))
        
private Collection<Employee> empl= new ArrayList<Employee>();
                
    // Getter und Setter...
        
}

Hier das Objekt das im Department als Collection gepeichert wird.(liegt auf Server und Client,Annotation nur auf Server Sersion)

@Embeddable
public class Employee implements Serializable
{
    
    private static final long serialVersionUID = 2L;
    
            
    public Employee()
{   }
 
    private int personalnummer;
    private String vorname;
    private String nachname;
    private String geburtstag;
    private String geburtsort; 
    private String tätigkeit;
    private String gehalt;
 
}

Server Klasse (vereinfacht)

public class Server
{
 
 
 
//erstelle Department Objekt  und binde es an registry. Mit dieser Variante habe ich zugriff auf das Objekt UND seine Collection!
 registry.bind("DepartmentOhneHibernate", department );
 
 
 
//Hibernate Variante 
//Session öfnen...
//Department mit PK 1 aus Datenbank laden
department = (DepartmentImpl)session.get(DepartmentImpl.class, 1);
//Objekt an Registry binden, hier funktioniert der zugriff auf die Collection NICHT
registerObject(DepartmentmitHibernate, department );

Client (vereinfacht)

public class Client
{
    public static void main(String[] args) throws ExceptionDepartment {
 
 
 
//zugriff auf Objekt das nicht aus der Datenbank geladen wurde
 Department dep= (Department) registry.lookup("DepartmentOhneHibernate")
//zugriff auf Collection , funktioniert
System.out.println(+dep.getEmpl().size());
 
 
//zugriff auf Objekt das  aus der Datenbank geladen wurde(Hibernate)
 Department dep= (Department) registry.lookup("DepartmentmitHibernate")
//zugriff auf Collection , funktioniert nicht
System.out.println(+dep.getEmpl().size());
;

hier die Fehlermeldung

Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: org.hibernate.collection.internal.PersistentIdentifierBag
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
    at com.sun.proxy.$Proxy1.getEmpl(Unknown Source)
    at Client.main(Client.java:89)
Caused by: java.lang.ClassNotFoundException: org.hibernate.collection.internal.PersistentIdentifierBag
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.rmi.server.LoaderHandler$Loader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at sun.rmi.server.LoaderHandler.loadClassForName(Unknown Source)
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
    at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
    at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
    at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)

Einen Security Manager habe ich auf Client und Server im einsatz.
Ohne den Security Manager bekomme ich eine andere Fehlermeldung beim zugriff auf das Datenbank Objekt im Client.
Auf dem Server habe ich auch zugriff auf die Collection des Objektes das aus Hibernate geladen wurde.

Für jeden Tipp bin ich sehr dankbar.

Hallo,

die Items des Persistent Layers über RMI (egal welches) zu übertragen ist nicht so gut.

Grund hierfür ist, dass die Objekte meist als Proxys instanziiert werden, die zwar von außen deiner Klasse gleichen intern aber viel mehr sind.

Deswegen kannst du die Entity Manager nicht über RMI übertragen und schon gar nicht Methoden, wie du sie aufrufst.

Ich würde eine ServiceEbene hinzufügen , die RMI unterstützt, und die Entitys in Beans konvertiert.

Danke für den Tipp, werde das mal versuchen umzusetzen.
lg