# Daten einer Datenbank in ein Formular einfügen



## ITrun90 (4. Mai 2015)

Hey,

Mein Problem ist folgendes:

Ich habe Daten zu verschiedenen Räumen gespeichert in einer MySQL-Datenbank. Ich verwende JPA für die Kommunikation mit der DB.

Ich habe also eine Entität "Raum"


```
package model;

import java.io.Serializable;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.persistence.*;

import org.hibernate.validator.constraints.NotEmpty;

import java.util.List;


/**
 * The persistent class for the raum database table.
 * 
 */
@Entity
@Named
@RequestScoped
@NamedQuery(name="Raum.findAll", query="SELECT r FROM Raum r")
public class Raum implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int raumOID;

	private String aktiv;

	@NotEmpty
	private String bezeichnung;

	//bi-directional many-to-many association to Behandlung
	@ManyToMany(mappedBy="raums")
	private List<Behandlung> behandlungs;

	//bi-directional many-to-one association to Praxi
	@ManyToOne
	@JoinColumn(name="PraxisOID")
	private Praxi praxi;

	//bi-directional many-to-one association to Termin
	@OneToMany(mappedBy="raum")
	private List<Termin> termins;

	public Raum() {
	}

	public int getRaumOID() {
		return this.raumOID;
	}

	public void setRaumOID(int raumOID) {
		this.raumOID = raumOID;
	}

	public String getAktiv() {
		return this.aktiv;
	}

	public void setAktiv(String aktiv) {
		this.aktiv = aktiv;
	}

	public String getBezeichnung() {
		return this.bezeichnung;
	}

	public void setBezeichnung(String bezeichnung) {
		this.bezeichnung = bezeichnung;
	}

	public List<Behandlung> getBehandlungs() {
		return this.behandlungs;
	}

	public void setBehandlungs(List<Behandlung> behandlungs) {
		this.behandlungs = behandlungs;
	}

	public Praxi getPraxi() {
		return this.praxi;
	}

	public void setPraxi(Praxi praxi) {
		this.praxi = praxi;
	}

	public List<Termin> getTermins() {
		return this.termins;
	}

	public void setTermins(List<Termin> termins) {
		this.termins = termins;
	}

	public Termin addTermin(Termin termin) {
		getTermins().add(termin);
		termin.setRaum(this);

		return termin;
	}

	public Termin removeTermin(Termin termin) {
		getTermins().remove(termin);
		termin.setRaum(null);

		return termin;
	}
	
	public Raum clone() 
	{
		Raum r = new Raum();
		r.setAktiv(this.getAktiv());
		r.setBehandlungs(this.getBehandlungs());
		r.setBezeichnung(this.getBezeichnung());
		r.setPraxi(this.getPraxi());
		r.setRaumOID(this.getRaumOID());
		r.setTermins(this.getTermins());
		return r;
	}
	
	@Override
	public boolean equals(Object obj) {
		String a = String.valueOf(obj);
		String b = String.valueOf(this.getRaumOID());
		if(a.equals(b))
		{
			return true;
		}
			return false;
	}

}
```

Um diese Entität zu verwalten, habe ich eine Manager, und eine Handlerklasse:


```
import java.util.Iterator;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import model.Behandlung;
import model.Raum;


@Stateless
public class RaumManager {

	@PersistenceContext
	private EntityManager em;
	@Inject
	private SessionBeanManager sessionBean;
	
	public Raum updateRaum(int id)
	{
		Raum r = getRaumById(id);
		r.setBezeichnung("Pups2");
		em.merge(r);
		//em.refresh(r);
		return r;
	}
	
	public Raum save(Raum raum)
	{
		em.persist(raum);
		em.flush();
		List<Behandlung> l = raum.getBehandlungs();
		for (Iterator<Behandlung> iterator = l.iterator(); iterator.hasNext();) {
			Behandlung type = (Behandlung) iterator.next();
			Query q = em.createNativeQuery("INSERT INTO raumbehandlung VALUES(" + raum.getRaumOID() + ", " + type.getBehandlungOID() + ")");
			q.executeUpdate();
		}
		
		return raum;
	}
	
	@SuppressWarnings("unchecked")
	public List<Raum> getRaums() {
		Query query = em.createNativeQuery("SELECT * FROM raum WHERE PraxisOID = " + sessionBean.getPraxis().getPraxisOID(), Raum.class);
		return query.getResultList();
	}
	
	public Raum getRaumById(int id)
	{
		Query query = em.createNativeQuery("SELECT * FROM raum WHERE RaumOID = " + id + " AND PraxisOID = " + sessionBean.getPraxis().getPraxisOID(), Raum.class);
		try{
			return (Raum) query.getSingleResult();
		}
		catch(Exception e)
		{
			return null;
		}
		
	}
	
	public void delete(int id)
	{
		em.remove(this.getRaumById(id));
	}
}
```


```
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import model.Behandlung;
import model.Raum;
import de.fhswf.kositza.manager.RaumManager;
import de.fhswf.kositza.manager.SessionBeanManager;

@Named
@RequestScoped
public class RaumHandler implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 8665180820620170277L;

	private int updateRaum;
	@Inject
	private Raum raum;
	
	@Inject
	private SessionBeanManager sessionBean;
	
	private int updateID;
	
	@EJB
	private RaumManager manager;
	
	// Flags
	private boolean successFlag = false;
	
	public void createRaum(ActionEvent event)
	{
		List<Behandlung> l = raum.getBehandlungs();
		for (Iterator<Behandlung> iterator = l.iterator(); iterator.hasNext();) {
			Behandlung type = (Behandlung) iterator.next();
			System.out.println(type.getBezeichnung());
			
		}
		raum.setPraxi(sessionBean.getPraxis());
		raum.setAktiv("1");
		manager.save(raum.clone());
		
		setSuccessFlag(true);
	}
	
	
	public void deleteRaum(int id)
	{
		manager.delete(id);
	}
	
	public void output() 
	{
		System.out.println(updateRaum);
	}
	public void update(int id)
	{
		updateRaum = id;
		Raum r = getRaumById(id);
		r.setPraxi(sessionBean.getPraxis());
		r.setAktiv("1");
		r.setRaumOID(id);
		raum = manager.updateRaum(id);
	}
	
	public Raum getRaumById(int id)
	{
		try {
			
			return raum;
		}
		catch(Exception e)
		{
			return null;
		}
	}
	
	public List<Raum> getRaums()
	{
		return manager.getRaums();
	}

	public boolean isSuccessFlag() {
		return successFlag;
	}

	public void setSuccessFlag(boolean successFlag) {
		this.successFlag = successFlag;
	}


	public int getUpdateID() {
		return updateID;
	}


	public void doUpdateID(int updateID) {
		
		this.updateID = updateID;
	}

}
```


Super wäre, wenn ich nun einen Eintrag zu den Räumen aus der Datenbank in ein Formular eintragen kann, welches so aufgebaut ist:


```
<h:form>
	<span class="beforeinput fa fa-user"></span>
	<h:inputText id="bezeichnung"
		class="validationToolTip checkForEmpty" 
		value="#{raum.bezeichnung}" 
		p:placeholder="Bezeichnung" />
	<h:message for="bezeichnung" errorClass="errorText"/>
	<br/>
						
	<div class="behandlungenCheckbox">
	<h4>Behandlungen wählen:</h4>
	<h:selectManyCheckbox value="#{raum.behandlungs}" converter="BehandlungConverter">
	 <c:forEach items="${behandlungHandler.behandlungen}" var="item">
		  <f:selectItem itemValue="${item.behandlungOID}" itemLabel="${item.bezeichnung}"/>
	</c:forEach>
	<f:converter converterId="BehandlungConverter"/>
	</h:selectManyCheckbox>
	</div>
	<br/>
	<span class="beforeinput fa fa-check"></span>
	<h:commandButton actionListener="#{ raumHandler.createRaum}" value="Anlegen">
		<f:ajax execute="@form" render="@all"></f:ajax>
	</h:commandButton>
						
	<span class="beforeinput fa fa-trash"></span>
	<h:commandButton p:type="reset" value="Abbrechen"></h:commandButton>
	<h:outputScript library="js/Validation" name="Validation.js"></h:outputScript>
</h:form>
```

Ich hab echt keinen Schimmer, wie ich das Formular befüllen kann.


----------



## stg (4. Mai 2015)

Da geht so viel in deinem Code drunter und drüber, dass ich mich wirklich frage, ob das an der Uhrzeit lag, zu der du gepostest hast, oder ob das ein Troll-Beitrag sein soll 

Ich weiß gar nicht, wo ich anfangen soll, daher rate ich dir hier einfach nur, dir einfach mal ein absolutes Grundlagen-Buch zur Hand zu nehmen, Von gesamten geposteten Code ist in der Form nämlich nahezu alles unbrauchbar.


----------



## ITrun90 (4. Mai 2015)

Hey,

vielen Dank für deinen Beitrag, 

könntest du mir einige (natürlich nicht alle, wenn es wirklich so viele sind) Fehler nennen?

Die Entität "Raum" wurde mir von Eclipse mit Hilfe der JPA-Tools generiert (da kann ja eigentlich kaum ein Fehler sein, oder?)

Den RaumHandler, und den RaumManager habe ich aus einem JEE7 - Tutorial von Video2Brain (auch hier dürften eigentlich nicht so gravierende Fehler sein hoffe ich).

Lediglich im HTML-Teil habe ich alles selbst gemacht (aber auch angelehnt an das Tutorial)


----------



## stg (4. Mai 2015)

Du machst aus deiner Entity zusätzlich eine CDI Bean, gibt es einen tieferen Grund dafür? Für mich sieht es eher so aus, dass hier layers durcheinander geworfen werden. Sofern du CDI nutzen möchtest, um eine Entity-Instanz zu injizieren, schreibe besser deinen eigenen Producer dafür (hieß das so? Ich glaub aber schon...)

Deine updateRaum-Methode sieht recht sinnfrei aus.

Willst du bei einer ManyToMany-Relation wirklich jedes mal alle Childs erstellen? Und selbst wenn, von NativeQueries würde ich gänzlich abraten. Nimm besser PreparedStatements, oder nutze NamedQueries, oder die Criteria API, oder ... naja hängt immer ganz vom jeweiligen Anwendungsfall ab. Insgesamt bleibt aber noch festzuhalten, dass, sofern du typsichere queries nutzt, auch keine "unchecked" Warnungen o.Ä, unterdrücken musst.

Wenn du schon CDI nutzt, wieso injizierst du in deine CDI Bean dann ziwschendurch mal mit @EJB ?

Exceptions zu schlucken ohne irgendwelche logs zu schreiben oder den Fehler angemessen zu behandeln, ist äußerst riskant. Wenn du später mal auf Fehlersuche gehen willst/musst, hast du kaum eine Chance einen Fehler an so einer Stelle zu finden.

Video2Brain kenn ich nicht, aber wenn du Code von da stammt, dann würde ich dir dringend zu einer anderen Lern-Quelle raten 

Öhm, ja, ich denke das reicht auch fürs erste...


----------

