2016-12-29 62 views
3

由于我正在阅读JPA(Java持久性API)。在那里我读到了Embeddable Classes。所以,我试图在实体类中使用这个概念。但是,在使用这个时,我面临着一个独立实体的问题。在实体中使用嵌入类时传递的分离实体持久化

这里我有Embeddable Class(ZipCode)in Entity。

嵌入类

@Embeddable public class ZipCode {  
private String zip;  
private String plusFour; 

//getter & setter also. 
} 

实体类

@Entity 
@Table(name = "address") 
public class Address { 

@Id 
@GeneratedValue(strategy = IDENTITY) 
private long id; 

@Embedded 
private ZipCode zipCode; 

//getter & setter also. 

} 

我的持久性代码:

@WebServlet("/RegisterServlet") 
public class RegisterServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 

@Inject 
private CrudService crudService; 

public RegisterServlet() { 
    super(); 
} 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.getWriter().append("Served at: ").append(request.getContextPath()); 
} 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    ZipCode z = new ZipCode(); 
    z.setZip("bharti"); 
    z.setPlusFour("rawat"); 

    Address a = new Address(); 
    a.setId(1); 
    a.setZipCode(z); 

    try{ 
     crudService.create(a); 

    }catch(Exception e){ 
     log.info("exception occurs "+ e.getMessage()); 
    } 

} 

}

我CrudSrvice代码

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class CrudServiceImpl implements CrudService { 
@PersistenceContext(unitName = "localmedecube") 
private EntityManager em; 

public CrudServiceImpl() { 
    // TODO Auto-generated constructor stub 
} 

@Override 
public <T> T create(T t) { 
    this.em.persist(t); 
    this.em.flush(); 
    this.em.refresh(t); 
    return t; 
} 

@Override 
public void delete(@SuppressWarnings("rawtypes") Class type, Object id) { 
    @SuppressWarnings("unchecked") 
    Object ref = this.em.getReference(type, id); 
    this.em.remove(ref); 

} 

@Override 
public <T> T update(T t) { 
    return this.em.merge(t); 
} 

}

当我试图坚持我的地址实体它给我的错误是这样

产生的原因:使用javax。 persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给 的分离实体persist:model.Address

请告诉我为什么会发生这种例外。也为我提供适当的答案。

+0

你如何试图坚持下去。你可以分享crudService.create方法 – xxlali

+0

好@xxlali我也共享CRUD代码。 –

+1

嗯,你使用坚持的方法。据我所知,如果你使用持久化方法,你不应该设置对象的id。请删除'a.setId(1);' – xxlali

回答

1

如果你已经持续Addressid = 1然后你的代码中断。您必须为每个请求设置一个新的id

由于您使用已经

@GeneratedValue(strategy = IDENTITY) 
private long id; 

数据库应设置id为您服务。先决条件是该字段id已创建为自动增量字段。

例如在创建时在MySQL中设置自动增量字段。

CREATE TABLE Persons 
(
id int NOT NULL AUTO_INCREMENT, 
<...> 
PRIMARY KEY (ID) 
) 
+0

你是对的。通过删除a.setId(1)代码将正常工作。 –

+0

感谢您的解决方案。 –

+0

不客气。 –

相关问题