# RMI und Hibernate



## xell66 (29. Nov 2013)

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.


----------



## RelaX (2. Dez 2013)

Nabend.

Ich kann nirgends finden:


```
registry.bind("DepartmentMitHibernate", department );
```

So wie ich das sehe kann er ja so in der Registry nichts finden. Kann es sein das du da etwas vergisst?


----------



## xell66 (2. Dez 2013)

Hi,

finde grad den Edit Button nicht sonst würde ich es grad ändern.
Habe vergessen es in dem vereinfachten Code richtig abzuändern, bei mir steht im original Code(genau wie hier noch):


```
registerObject(DepartmentmitHibernate, department );
```

RegisterObject() ist eine Methode die genau das macht was du sagtest, also:


```
registry.bind("DepartmentMitHibernate", department );
```

zusätzlich wird noch eine Ausgabe auf der Konsole erzeugt . Mein Fehler hab vergessen es hier zu ändern.

Habe den Fehler aber mehr oder weniger herausgefunden. Ich benötige ein DAO um nicht direkt die Hibernate Entität zu übertragen. Muss mich da mal noch reinarbeiten.

lg


----------

