hibernate mit SSH

youza

Erfahrenes Mitglied
Hi Leute,

also ich hab jetzt schon ein bisschen gesucht und auch ein bisschen was gefunden aber ich bekomm es nicht so ganz hin. Also
ich möchte auf einen MySQL Server mit hibernate zugreifen (lokal(ohne SSH) funktioniert schon alles).
Wir wollen des Ganze jetzt aber zentral machen also einen Server auf dem die MySQL Datenbank läuft und des Tool sollte lokal ausgeführt werden können.

Die MySQL Datenbank soll nach außen nicht sichtbar sein und nur über einen SSH-Tunnel erreichbar sein. Soweit mein Szenario.

Bis jetzt hab ich lokal das Tool komplett fertig und es läuft mit einer Hibernate Persitenze schicht. Ich kann auf dem Server auch eine SSH-Session erstellen mit JSch http://www.jcraft.com/jsch/ jetzt hab ich nur keinen plan was ich hibernate übergeben muss bzw. wie ich es konfigurieren muss um mit dem Server über SSH die Hibernatebefehle auszuführen.

Ich hoffe es ist verständlich :D

Vielen Dank schonmal im Vorraus
Youza
 

youza

Erfahrenes Mitglied
so ich bin eventuell ein bißchen weitergekommen, ich mach des jetzt mit Portforwarding
mein Forwarding Klasse sieht wie folgt aus:
Java:
import com.jcraft.jsch.*;
import com.openbrowsergame.logic.Main;

import java.awt.*;

import javax.swing.*;

public class PortForwardingL {
	public PortForwardingL() {

		int lport;
		String rhost;
		int rport;

		try {
			JSch jsch = new JSch();

			String host = "host_name";
			Main.session = jsch.getSession(Main.sshusername, host, 22);
			lport = Main.port;
			rhost = host;
			rport = 3306;
			System.out.println(Main.sshusername);
			System.out.println(Main.sshpassword);

			// username and password will be given via UserInfo interface.
			UserInfo ui = new MyUserInfo();
			Main.session.setUserInfo(ui);

			Main.session.connect();

			// Channel channel=session.openChannel("shell");
			// channel.connect();

			int assinged_port = Main.session.setPortForwardingL(lport, rhost,
					rport);
			System.out.println("localhost:" + assinged_port + " -> " + rhost
					+ ":" + rport);
		} catch (Exception e) {
			System.out.println(e);
		}
	}

	public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {
		public String getPassword() {
			return passwd;
		}

		public boolean promptYesNo(String str) {
			Object[] options = { "yes", "no" };
			int foo = JOptionPane.showOptionDialog(null, str, "Warning",
					JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
					null, options, options[0]);
			return foo == 0;
		}

		String passwd;
		JTextField passwordField = (JTextField) new JPasswordField(20);

		public String getPassphrase() {
			return null;
		}

		public boolean promptPassphrase(String message) {
			return true;
		}

		public boolean promptPassword(String message) {
			passwd = Main.sshpassword;
			return true;

		}

		public void showMessage(String message) {
			JOptionPane.showMessageDialog(null, message);
		}

		final GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1, 1,
				GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
				new Insets(0, 0, 0, 0), 0, 0);
		private Container panel;

		public String[] promptKeyboardInteractive(String destination,
				String name, String instruction, String[] prompt, boolean[] echo) {
			panel = new JPanel();
			panel.setLayout(new GridBagLayout());

			gbc.weightx = 1.0;
			gbc.gridwidth = GridBagConstraints.REMAINDER;
			gbc.gridx = 0;
			panel.add(new JLabel(instruction), gbc);
			gbc.gridy++;

			gbc.gridwidth = GridBagConstraints.RELATIVE;

			JTextField[] texts = new JTextField[prompt.length];
			for (int i = 0; i < prompt.length; i++) {
				gbc.fill = GridBagConstraints.NONE;
				gbc.gridx = 0;
				gbc.weightx = 1;
				panel.add(new JLabel(prompt[i]), gbc);

				gbc.gridx = 1;
				gbc.fill = GridBagConstraints.HORIZONTAL;
				gbc.weighty = 1;
				if (echo[i]) {
					texts[i] = new JTextField(20);
				} else {
					texts[i] = new JPasswordField(20);
				}
				panel.add(texts[i], gbc);
				gbc.gridy++;
			}

			if (JOptionPane.showConfirmDialog(null, panel, destination + ": "
					+ name, JOptionPane.OK_CANCEL_OPTION,
					JOptionPane.QUESTION_MESSAGE) == JOptionPane.OK_OPTION) {
				String[] response = new String[prompt.length];
				for (int i = 0; i < prompt.length; i++) {
					response[i] = texts[i].getText();
				}
				return response;
			} else {
				return null; // cancel
			}
		}
	}
}

Anschließend behandle ich den Port wie eine lokalen Port damit ist meine hibernate.cfg.xml:
Code:
<?xml version='1.0' encoding='utf-8'?>
<!-- Die wichtigste Datei für hibernate hier werden die Grundlegenden Dienge spezifiziert und angegeben welche Klassen gemappt sind -->
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Verbindungs Klasse -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- JDBC Verbindungs pool -->
        <property name="connection.pool_size">1</property>
        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>	    
        <!-- Hier wird festgelegt welche Klassen gemappt sind -->
	    <mapping resource="com/openbrowsergame/dto/Profession.hbm.xml"/>
	    <mapping resource="com/openbrowsergame/dto/Recipe.hbm.xml"/>
	    <mapping resource="com/openbrowsergame/dto/Resource_type.hbm.xml"/>
	    <mapping resource="com/openbrowsergame/dto/Resource.hbm.xml"/>
	    <mapping resource="com/openbrowsergame/dto/Recipe_has_resource.hbm.xml"/>
	   
    </session-factory>
</hibernate-configuration>

hibernateUtil.java:
Java:
package com.openbrowsergame.persistence;


import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

import com.openbrowsergame.logic.Main;
/*
 * Standard Hibernate Klasse welche die Session initialisiert und später die SessionFactory zurückgibt
 * Lädt die hibernate.cfg.xml
 */
public class HibernateUtil {
	private static ServiceRegistry serviceRegistry;
	private static SessionFactory sessionFactory = buildSessionFactory();
	public static SessionFactory buildSessionFactory() {
		try {
			Configuration cfg = new Configuration().configure();
			cfg.setProperty("hibernate.connection.url", Main.database_url);
			cfg.setProperty("hibernate.connection.username", Main.username);
			cfg.setProperty("hibernate.connection.password", Main.password);
			
			serviceRegistry = new ServiceRegistryBuilder().applySettings(
					cfg.getProperties()).buildServiceRegistry();
			sessionFactory = cfg.buildSessionFactory(serviceRegistry);

		} catch (Throwable ex) {
			System.err.println("Failed to create sessionFactory object."
					+ ex);
			throw new ExceptionInInitializerError(ex);
		}
		return sessionFactory;
	}
}
des Programm läuft auch an behauptet auch, dass der Port assigned ist allerdings in dem Moment wenn sich hibernate dann verbinden möchte passiert einfach nichts habt ihr da ne Idee?

Vielen Dank schonmal
Youza

@Edit
Hat sich erledigt funktioniert genauso wie es oben steht man sollte nur natürlich darauf achten Ports zu verwenden die nicht bestzt sind :D
 
Zuletzt bearbeitet:

Neue Beiträge