2016-03-01 2 views
0

Я хочу удалить объект. Когда я отлаживаю код, его работа хорошо, но объект не удалялся из БД. Посмотрите ниже.Как удалить объект в jpa

код XHTML:

<p:dataGrid value="#{staffUpdateMB.addressInfoList}" 
     id="addesList" var="address" columns="1" layout="grid" 
     styleClass="NoPadding NoIndent"> 
     <p:panel> 
      <div 
       class="Container100 Responsive100 TealGreenBack BordRad5 White NoIndent"> 

       <div class="Container50 Responsive100 NoIndent"> 
        <h:outputText value="#{address.addressType}" styleClass="Fs22" /> 
       </div> 
       <div class="Container50 Responsive100 TexAlRight NoIndent"> 
        <p:commandButton class="TealGreenBack" icon="fa fa-edit" 
        onstart="PF('staffAddressEditDialog').show()"> 
        <f:setPropertyActionListener value="#{address}" 
          target="#{staffUpdateMB.beanAddressInfo}"/> 
        </p:commandButton> 
        <p:commandButton styleClass="RedButton RaisedButton" 
         action="#{staffUpdateMB.removeAddress}" icon="fa fa-trash-o" 
         update="addesList" ajax="false"> 
         <f:setPropertyActionListener value="#{address}" 
          target="#{staffUpdateMB.beanAddressInfo}" /> 
        </p:commandButton> 
       </div> 
      </div> 
     ... .... .. 
    </p:panel> 
    </p:dataGrid> 

Java коды:

ManageBean Метод Здесь:

public void removeAddress() { 
    try { 

     System.out.println("Address ID :"+this.beanAddressInfo.getAddressID()); 

     addressInfoDao.remove(this.beanAddressInfo.getAddressID()); 


     context.addMessage(null, new FacesMessage(msg.getPropValue("deleteSuccess"))); 
    } catch (Exception e) { 
     context.addMessage(null, new FacesMessage(msg.getPropValue("deleteError"))); 
     logger.error("This is error : " + e); 
     logger.fatal("This is fatal : " + e); 
    } 
} 

Вот StaffRegiAddressInfo Entity:

@Entity 
    @Table(name="staffregi_addressinfo") 
    public class StaffRegiAddressInfo implements Serializable{ 


private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="addressID") 
private int addressID; 

@Column(name="addressType") 
private String addressType; 

@Column(name="village") 
private String village; 

@Column(name="postOffice") 
private String postOffice; 

@Column(name="postalCode") 
private String postalCode; 

@Column(name="thanaName") 
private String thanaName; 

@Column(name="districtName") 
private String districtName; 

@Column(name="divisionName") 
private String divisionName; 

@Column(name="countryName") 
private String countryName; 

@Column(name="instituteID") 
private String instituteID; 

@Column(name="recordNote") 
private String recordNote; 

@Column(name="userExecuted") 
private String userExecuted; 

@Column(name="dateExecuted") 
@Temporal(TemporalType.TIMESTAMP) 
private Date dateExecuted; 

@Column(name="ipExecuted") 
private String ipExecuted; 

@Column(name="recordStatus") 
private int recordStatus; 


@ManyToOne 
@JoinColumn(name="staffID") 
private StaffRegiBasicInfo basicInfoAddress; 
    //setter, getter also.. 

Вот StaffRegiBasicInfo Организация:

@Entity 
    @Table(name="staffregi_basicinfo") 
    public class StaffRegiBasicInfo implements Serializable{ 


    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="staffID") 
    private String staffID; 

    @OneToMany(cascade=CascadeType.ALL, mappedBy="basicInfoAddress") 
    @LazyCollection(LazyCollectionOption.FALSE) 
    private Set<StaffRegiAddressInfo> addressInfoList; 

Я использую Spring 4, Hibernate 4, primefaces 5,2

+2

Можете ли вы показать код 'addressInfoDao'? – Jens

+0

Возможно, вы забыли manager.flush() внутри метода remove() вашего dao? –

+0

общедоступный интерфейс StaffRegiAddressInfoDao расширяет EntityDao { } –

ответ

0

Операция EntityManager.remove() используется для удаления object из базы данных. remove не удаляет напрямую объект из базы данных, он отмечает объект, который должен быть удален в persistence context (транзакция). Когда транзакция завершена или если persistence context будет сброшен, объект будет удален из базы данных.

Операция remove может быть вызвана только внутри транзакции, исключение будет выведено за пределы транзакции. Операция remove должна вызываться на управляемом объекте, а не на отдельном объекте. Как правило, вы должны сначала найти объект перед его удалением, хотя можно позвонить EntityManager.getReference() на ИД объекта и позвонить по ссылке remove по ссылке. В зависимости от того, как поставщик JPA оптимизирует getReference и remove, может не потребоваться чтение объекта из базы данных.

Например (в случае Bean managed transaction)

EntityManager em = getEntityManager(); 
em.getTransaction().begin(); 
Employee employee = em.find(Employee.class, id); 
em.remove(employee); 
em.getTransaction().commit(); 

Для подробно пройти через Documentation Link.

Смежные вопросы