2016-04-08 6 views
0

Ich erstelle eine Java EE (Web) -Anwendung mit JPA und EJB für Model-Tier. Ich denke, ich muss Session Beans für CRUD verwenden.Wie funktioniert ".merge (entity)"?

das ist mein BrandFacade.java (Session Bean)

package model.business; 

import model.localinterface.BrandFacadeLocal; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import model.entities.Brand; 

@Stateless 
public class BrandFacade extends AbstractFacade<Brand> implements BrandFacadeLocal, BrandFacadeRemote { 

    @PersistenceContext(unitName = "MyWheelEE-ejbPU") 
    private EntityManager em; 

    @Override 
    protected EntityManager getEntityManager() { 
     return em; 
    } 

    public BrandFacade() { 
     super(Brand.class); 
    } 


    @Override 
    public boolean CreateBrand(String name) { 
     Brand brand=new Brand(0, name); 
     boolean result=true; 
     try { 
      em.persist(brand); 
     } catch (Exception e) { 
      result=false; 
     } 
     em.close(); 
     return result; 
    } 

    @Override 
    public void deleteBrand(int brandOid) { 
     em.remove(getBrandByOid(brandOid)); 
     em.flush(); 
    } 

    @Override 
    public Brand getBrandByOid(int brandOid) { 
     em.flush(); 
     return em.find(Brand.class, brandOid); 
    } 

    @Override 
    public void editBrand(Brand brand) { 
     em.merge(brand); 
     em.flush(); 
    } 


} 

und das ist mein Brand.java Klasse (entity)

package model.entities; 

import java.io.Serializable; 
import java.util.List; 
import javax.persistence.Basic; 
import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlTransient; 

@Entity 
@Table(name = "brand") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Brand.findAll", query = "SELECT b FROM Brand b"), 
    @NamedQuery(name = "Brand.findByOid", query = "SELECT b FROM Brand b WHERE b.oid = :oid"), 
    @NamedQuery(name = "Brand.findByName", query = "SELECT b FROM Brand b WHERE b.name = :name")}) 
public class Brand implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "oid") 
    private Integer oid; 
    @Basic(optional = false) 
    @Column(name = "name") 
    private String name; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "brandOid") 
    private List<Wheelchair> wheelchairList; 

    public Brand() { 
    } 

    public Brand(Integer oid) { 
     this.oid = oid; 
    } 

    public Brand(Integer oid, String name) { 
     this.oid = oid; 
     this.name = name; 
    } 

    public Integer getOid() { 
     return oid; 
    } 

    public void setOid(Integer oid) { 
     this.oid = oid; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @XmlTransient 
    public List<Wheelchair> getWheelchairList() { 
     return wheelchairList; 
    } 

    public void setWheelchairList(List<Wheelchair> wheelchairList) { 
     this.wheelchairList = wheelchairList; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (oid != null ? oid.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Brand)) { 
      return false; 
     } 
     Brand other = (Brand) object; 
     if ((this.oid == null && other.oid != null) || (this.oid != null && !this.oid.equals(other.oid))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "model.entities.Brand[ oid=" + oid + " ]"; 
    } 

} 

Ich möchte wissen, wie funktioniert .merge Methode funktioniert. .. ich denke, es in der DB die Entität suchen, die den Primärschlüssel der Entität übergeben hat und dann auf bearbeiteten Feldern richtig funktioniert?

aber wie kann ich eine Marke bearbeiten, die nur den Namen kennt?

+0

Du solltest deine Fragen wirklich trennen –

Antwort

1

Es ist eigentlich ganz einfach, hier Ihre Antworten:

Ich möchte wissen, wie funktioniert .merge Methode funktioniert ... Wenn Sie Methode fusionieren aufrufen, wird JPA überprüfen, ob das Feld als Primärschlüssel markiert (@Id) ist nicht null: - IF YES: JPA erstellt einen neuen Datensatz in Ihrer Datenbank - IT NOT: JPA wird Ihren Datensatz mit dem ID-Feld Wert, etwa wie aktualisieren (UPDATE Tabellenname ..... WHERE ID = ?) So, du hast Recht :)

aber wie kann ich eine Marke mit Wissen o bearbeiten Nur der Name? Wenn Sie möchten, bearbeiten einen Datensatz ein anderes Feld, anstatt Id Feld zu wissen, werden Sie zwei Möglichkeiten: 1. Schreiben JPQL, so etwas wie:

UPDATE Person p SET p.lastName = 'New Last Name' WHERE p.name = 'his name' 
  1. eine Mutter schreiben Abfrage, in diesem Fall, werden Sie EBENE SQL und der Lauf es

in beiden Fällen schreiben, müssen Sie etwas tun, wie:

Query query = em.createQuery or em.createNativeQuery 

und dann führe es einfach aus

+0

thx viel! Also ich denke, es ist nützlich, eine Methode zu machen, um ID PRIMARY KEY nach Namen zu bekommen. natürlich sollte es ein einzigartiges Feld sein. Was ist mit Transaktion? – Marco

Verwandte Themen