2015-01-02 3 views
0

JPA 방법에 문제가 있습니다. CustomerDB Netbeans 튜토리얼 (https://netbeans.org/kb/docs/websvc/rest.html)을 따르고 있습니다. 문제는 데이터베이스에 데이터를 저장할 수 없다는 것입니다. Persist 메서드는 execute이며 어떤 예외도 발생시키지 않으므로 persist가 올바르게 끝났다고 가정합니다. 그러나 데이터베이스를 검사 할 때 모든 데이터가 삽입되었습니다.지속성 방법이 작동하지 않습니다.

내의 persistence.xml은 다음과 같습니다

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="CustomerDBPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>entities.Customer</class> 
    <class>entities.MicroMarket</class> 
    <class>entities.DiscountCode</class> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://192.168.29.130:3306/sample"/> 
     <property name="javax.persistence.jdbc.user" value="cosio"/> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="javax.persistence.jdbc.password" value="316723"/> 
     <property name="eclipselink.logging.level" value="FINEST"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

entitie는 MicroMarket.java입니다 :

package entities; 

import java.io.Serializable; 
import java.util.Collection; 
import javax.persistence.Basic; 
import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
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 = "micro_market") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "MicroMarket.findAll", query = "SELECT m FROM MicroMarket m"), 
    @NamedQuery(name = "MicroMarket.findByZipCode", query = "SELECT m FROM MicroMarket m WHERE m.zipCode = :zipCode"), 
    @NamedQuery(name = "MicroMarket.findByRadius", query = "SELECT m FROM MicroMarket m WHERE m.radius = :radius"), 
    @NamedQuery(name = "MicroMarket.findByAreaLength", query = "SELECT m FROM MicroMarket m WHERE m.areaLength = :areaLength"), 
    @NamedQuery(name = "MicroMarket.findByAreaWidth", query = "SELECT m FROM MicroMarket m WHERE m.areaWidth = :areaWidth")}) 
public class MicroMarket implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "zip_code") 
    private String zipCode; 
    // @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation 
    @Column(name = "radius") 
    private Double radius; 
    @Column(name = "area_length") 
    private Double areaLength; 
    @Column(name = "area_width") 
    private Double areaWidth; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "zip") 
    private Collection<Customer> customerCollection; 

    public MicroMarket() { 
    } 

    public MicroMarket(String zipCode) { 
     this.zipCode = zipCode; 
    } 

    public String getZipCode() { 
     return zipCode; 
    } 

    public void setZipCode(String zipCode) { 
     this.zipCode = zipCode; 
    } 

    public Double getRadius() { 
     return radius; 
    } 

    public void setRadius(Double radius) { 
     this.radius = radius; 
    } 

    public Double getAreaLength() { 
     return areaLength; 
    } 

    public void setAreaLength(Double areaLength) { 
     this.areaLength = areaLength; 
    } 

    public Double getAreaWidth() { 
     return areaWidth; 
    } 

    public void setAreaWidth(Double areaWidth) { 
     this.areaWidth = areaWidth; 
    } 

    @XmlTransient 
    public Collection<Customer> getCustomerCollection() { 
     return customerCollection; 
    } 

    public void setCustomerCollection(Collection<Customer> customerCollection) { 
     this.customerCollection = customerCollection; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (zipCode != null ? zipCode.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 MicroMarket)) { 
      return false; 
     } 
     MicroMarket other = (MicroMarket) object; 
     if ((this.zipCode == null && other.zipCode != null) || (this.zipCode != null && !this.zipCode.equals(other.zipCode))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "entities.MicroMarket[ zipCode=" + zipCode + " ]"; 
    } 

} 

내 MicroMarketFacadeRest은 다음과 같습니다

package entities.service; 

import entities.MicroMarket; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.EntityTransaction; 
import javax.persistence.Persistence; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.DELETE; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.PUT; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Response; 

@javax.ejb.Stateless 
@Path("entities.micromarket") 
public class MicroMarketFacadeREST extends AbstractFacade<MicroMarket> { 
    @PersistenceContext(unitName = "CustomerDBPU") 
    private EntityManager em; 

    @Override 
    protected EntityManager getEntityManager() { 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("CustomerDBPU"); 
     EntityManager em = emf.createEntityManager(); 
     return em; 
     //return em; 
    } 

    public MicroMarketFacadeREST() { 
     super(MicroMarket.class); 
    } 


    @POST 
    @Path("persisting") 
    public Response persisting() { 
     MicroMarket testZip = new MicroMarket("10097"); 
     testZip.setRadius(1987.854); 
     testZip.setAreaLength(975.875); 
     testZip.setAreaWidth(865.681); 
     EntityTransaction tx = getEntityManager().getTransaction(); 
     try { 
      tx.begin(); 
      getEntityManager().persist(testZip); 
      tx.commit(); 
    } catch (Exception e) { 
      if (tx != null) { 
       tx.rollback(); 
     } 
     throw e; 
     } finally { 
      getEntityManager().close(); 
    } 
     return Response.status(200).entity("Persist is finishing").build(); 
    } 

    @GET 
    @Path("{id}") 
    @Produces({"application/xml", "application/json"}) 
    public MicroMarket find(@PathParam("id") String id) { 
     return super.find(id); 
    } 

    @GET 
    @Override 
    @Produces({"application/xml", "application/json"}) 
    public List<MicroMarket> findAll() { 
     return super.findAll(); 
    } 

} 

그리고 내 AbstractFacade.java :

package entities.service; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 

public abstract class AbstractFacade<T> { 
    private Class<T> entityClass; 

    public AbstractFacade(Class<T> entityClass) { 
     this.entityClass = entityClass; 
    } 

    protected abstract EntityManager getEntityManager(); 

    public void create(T entity) { 
     getEntityManager().persist(entity); 
    } 

    public void edit(T entity) { 
     getEntityManager().merge(entity); 
    } 

    public void remove(T entity) { 
     //getEntityManager().remove(entity); 
     getEntityManager().remove(getEntityManager().merge(entity)); 
    } 

    public T find(Object id) { 
     System.out.println("Id of Customer requesteddddddddd" + id); 
     System.out.println(id); 
     System.out.println(entityClass); 
     System.out.println("El puto objeto no esta vacio!!!"); 
     //return getEntityManager().find(entityClass, (Integer)id); 
     return getEntityManager().find(entityClass, id); 
    } 

    public List<T> findAll() { 
     //EntityManagerFactory emf = Persistence.createEntityManagerFactory("CustomerDBPU"); 
     //EntityManager em = emf.createEntityManager(); 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     return getEntityManager().createQuery(cq).getResultList(); 
    } 

    public List<T> findRange(int[] range) { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
      cq.select(cq.from(entityClass)); 
     javax.persistence.Query q = getEntityManager().createQuery(cq); 
     q.setMaxResults(range[1] - range[0] + 1); 
     q.setFirstResult(range[0]); 
     return q.getResultList(); 
    } 

    public int count() { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     javax.persistence.criteria.Root<T> rt = cq.from(entityClass); 
     cq.select(getEntityManager().getCriteriaBuilder().count(rt)); 
     javax.persistence.Query q = getEntityManager().createQuery(cq); 
     return ((Long) q.getSingleResult()).intValue(); 
    } 

} 

그래서 persisting() 메서드는 예외없이 올바르게 실행되지만 데이터베이스 데이터는 삽입되지 않은 것이 문제입니다. 그러나 찾아 findall은 제대로 실행되고 MicroMarket 데이터베이스에서 제대로 반환도 로그에 나는이 볼 수

[EL Fine]: sql: 2015-01-02 19:12:14.017--ServerSession(206951341)--Connection(496870266)--Thread(Thread[http-nio-8084-exec-81,5,main])--SELECT zip_code, area_length, area_width, radius FROM micro_market 

아무도 나를 도울 수 있습니까? 모든 의견을 크게 주시면 감사하겠습니다. 정말 고마워.

+0

EJB를 사용하고 있습니다. EJB의 요점은 트랜잭션을 선언적으로 처리한다는 것입니다. 따라서 트랜잭션을 프로그래밍 방식으로 시작하고 커밋하지 않아야합니다. 상태 비 저장 빈의 메소드는 기본적으로 트랜잭션입니다. 컨테이너는 메서드가 반환 된 후 트랜잭션을 자동으로 커밋합니다. 물론 트랜잭션을 작동 시키려면 트랜잭션 유형을 RESOURCE_LOCAL이 아니라 JTA로 설정해야합니다. 또한 메소드를 호출하는 대신 의존적 인 주입을 사용하여 EntityManager를 가져와야한다. –

+0

persit 아래에서 getEntityManager() .flush() 메소드를 호출하고 예외가 표시되는지 확인합니다. – uaiHebert

+0

안녕하세요 uaiHebert 도와 주셔서 감사합니다. 예, getEntityManager(). flush()를 getEntityManager() 바로 뒤에 삽입하면 persist (testZip) 예외가 throw됩니다. -> org.apache.catalina.core.StandardWrapperValve.invoke El Servlet.service() para el servlet [ [/ CustomerDB] 예외 처리 [javax.persistence.TransactionRequiredException : 예외 설명 : 현재 활성 트랜잭션 없음] javax.persistence.TransactionRequiredException : 예외 설명 : 아니요. 거래는 현재 활성화되어 있습니다 – Cosio

답변

0

사이드 노트 : 전쟁 중에도 (심지어 전쟁 중에도) eclipselinks를 가져올 수 있습니다. openjpa에 관해서는 jpa 2.1 기능을 사용하지 않는 것 같아서 네임 스페이스와 jpa 버전을 2.0으로 변경하면됩니다.

0

주된 오류는 내 휴식 서비스가 Apache Tomcat에서 실행 중이며 EJB에 대한 지원이 없다는 것입니다. TomEE와 함께 사용해 보았지만 persist 메서드와 동일한 문제가 있습니다. 기본적으로 TomEE에는 EclipseLink 대신 OpenJPA가 있습니다. 마지막으로 GlassFish에 내 응용 프로그램을 배포하려고 시도했지만 이제는 제대로 실행되고 있습니다.

관련 문제