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.