在实体中使用嵌入式 class 时,分离的实体传递给持久化
Detached entity passed to persist while using embedded class in entity
因为,我正在阅读 JPA(Java 持久性 API)。在那里我读到了可嵌入的 Classes。因此,我正尝试在我的实体 class 中使用该概念。但是在使用它时我遇到了分离实体的问题。
这里我在实体中嵌入了 Class(ZipCode)。
可嵌入Class
@Embeddable public class ZipCode {
private String zip;
private String plusFour;
//getter & setter also.
}
实体Class
@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);
}
}
当我尝试保留我的地址实体时,它给我这样的错误
Caused by: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to
persist: model.Address
请告诉我为什么会出现这个异常。也给我适当的答案。
如果您已经使用 id = 1
坚持了 Address
,那么您的代码就会中断。您必须为每个请求设置一个新的 id
。
因为您已经在使用
@GeneratedValue(strategy = IDENTITY)
private long id;
数据库应该为您设置 id。前提条件是字段 id
已创建为自动递增字段。
例如在 MySQL
.
创建时设置一个自增字段
CREATE TABLE Persons
(
id int NOT NULL AUTO_INCREMENT,
<...>
PRIMARY KEY (ID)
)
因为,我正在阅读 JPA(Java 持久性 API)。在那里我读到了可嵌入的 Classes。因此,我正尝试在我的实体 class 中使用该概念。但是在使用它时我遇到了分离实体的问题。
这里我在实体中嵌入了 Class(ZipCode)。
可嵌入Class
@Embeddable public class ZipCode {
private String zip;
private String plusFour;
//getter & setter also.
}
实体Class
@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);
}
}
当我尝试保留我的地址实体时,它给我这样的错误
Caused by: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: model.Address
请告诉我为什么会出现这个异常。也给我适当的答案。
如果您已经使用 id = 1
坚持了 Address
,那么您的代码就会中断。您必须为每个请求设置一个新的 id
。
因为您已经在使用
@GeneratedValue(strategy = IDENTITY)
private long id;
数据库应该为您设置 id。前提条件是字段 id
已创建为自动递增字段。
例如在 MySQL
.
CREATE TABLE Persons
(
id int NOT NULL AUTO_INCREMENT,
<...>
PRIMARY KEY (ID)
)