Announcement Announcement Module
Collapse
No announcement yet.
Hibernate + JPA + Spring: detached entity passed to persist Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hibernate + JPA + Spring: detached entity passed to persist

    I am using spring, hibernate and JPA for my data access layer.

    I am getting the following exception when try to persist the classes below.

    Code:
    Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com. service.sqlmap.models.Product; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.service.sqlmap.models.Product
    Code:
    @Entity
    @Table(name = "service")
    @NamedQueries({@NamedQuery(name = "Service.findAll", query = "SELECT s FROM Service s")})
    public class Service implements Serializable {
    
        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
        @Column(name = "service_code")
        private String serviceCode;
       
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "service", fetch = FetchType.LAZY)
        private Set<Product> products = new HashSet<Product>();
    
    ...getters and setters
    }
    
    @Entity
    @Table(name = "product")
    @NamedQueries({@NamedQuery(name = "Product.findAll", query = "SELECT p FROM Product p")})
    public class Product implements Serializable {
    
        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
        @Column(name = "product_id")
        private Long productId;
        
        @JoinColumn(name = "service_code", referencedColumnName = "service_code", insertable = true, updatable = true)
        @ManyToOne(optional = false)
        private Service service;
    
    ...getters and setters
    }
    
    public class ServiceDao extends BaseModel {
        protected PersistenceManager persistenceManager;
    
        public void create(Service serviceBean) {
            persistenceManager.create(serviceBean);
        }
    
        public void setPersistenceManager(PersistenceManager persistenceManager) {
            this.persistenceManager = persistenceManager;
        }
    
        public PersistenceManager getPersistenceManager() {
            return persistenceManager;
        }
        
    }
    
    public class PersistenceManagerImpl extends JpaDaoSupport implements PersistenceManager {
    
        public void create(BaseModel entity) {
            getJpaTemplate().persist(entity);
        }
    }
    
    @Transactional(readOnly = true)
    public interface PersistenceManager {
        @Transactional(readOnly = false, propagation=Propagation.REQUIRES_NEW, rollbackFor=SQLException.class)
        public void create(BaseModel entity) ;
    }
    the persistence manager is injected by spring
    Code:
     <bean id="persistenceManagerTarget" class="com.service.dal.PersistenceManagerImpl">
            <property name="entityManagerFactory" ref="entityManagerFactory" />
     </bean>
     <bean id="serviceDao" class="com.service.sqlmap.dao.ServiceDao">
            <property name="persistenceManager" ref="persistenceManagerTarget"/>
     </bean>
    Below is an example of what I am doing with the above code.
    Code:
    Service serviceBean = new ServiceBean("120");
    Product product = new Product(10);
    
    product.setService(serviceBean);
    serviceBean.getProducts().add(product);
    serviceDao.create(serviceBean);
    At first I thought it was the lazy loading but I change to eager and it was the same problem. Ideally I want it to be lazy because it loads a lot of objects into memory and I do not want all of it in there at once.

    What could be the problem here? Let me know if I need to provide anything else.

  • #2
    any help on this issue?

    Comment

    Working...
    X