2016-04-08 24 views
0

我創建了一個使用JPA和EJB模型層的java EE(web)應用程序。 我想我必須使用Session Beans for CRUD。「.merge(實體)」如何工作?

這是我BrandFacade.java(會話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(); 
    } 


} 

,這是我Brand.java類(實體)

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 + " ]"; 
    } 

} 

我想知道怎麼做.merge方法的工作。 ..我認爲它在數據庫中搜索具有實體的主鍵通過的實體,然後它在編輯的字段上的權利?

但我如何編輯知道只有名字的品牌?

+0

你真的應該分開你的問題 –

回答

1

這真的很簡單,在這裏你的答案:

我想知道怎麼做.merge方法工作... 當你調用合併方法,JPA將驗證如果該字段標記爲主要鍵( @Id)不爲空: - 如果是:JPA將在您的數據庫中創建一條新記錄 - IT NOT:JPA將使用id字段值更新您的記錄,例如(UPDATE table_name ..... WHERE id = ?) 所以,你是對的:)

但我如何編輯一個品牌知道o這個名字? 如果你想知道編輯另一個領域,而不是編號字段的記錄,你將有2種選擇: 1.寫JPQL,是這樣的:

UPDATE Person p SET p.lastName = 'New Last Name' WHERE p.name = 'his name' 
  • 編寫本機查詢,在這種情況下,你會寫純SQL和運行它
  • 在這兩種情況下,你需要做這樣的事情:

    Query query = em.createQuery or em.createNativeQuery 
    

    然後執行它

    +0

    thx很多!所以我認爲這是有用的做一個方法來獲得ID PRIMARY KEY的名稱。當然它應該是一個獨特的領域。交易怎麼樣? – Marco