Java 在实体中使用嵌入类时传递给持久化的分离实体
如前所述,我正在阅读JPA(Java持久性API)。在那里我读到了关于可嵌入类的内容。所以,我试图在我的实体类中使用这个概念。但是在使用这个的时候,我面临着一个分离实体的问题 这里我在实体中有一个可嵌入类(ZipCode) 可嵌入类Java 在实体中使用嵌入类时传递给持久化的分离实体,java,jpa,persistence,Java,Jpa,Persistence,如前所述,我正在阅读JPA(Java持久性API)。在那里我读到了关于可嵌入类的内容。所以,我试图在我的实体类中使用这个概念。但是在使用这个的时候,我面临着一个分离实体的问题 这里我在实体中有一个可嵌入类(ZipCode) 可嵌入类 @Embeddable public class ZipCode { private String zip; private String plusFour; //getter & setter also. } @Entity @Tab
@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.
}
实体类
@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());
}
}
}
我的CRUDService代码:
@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);
}
@无状态
@TransactionAttribute(TransactionAttributeType.REQUIRED)
公共类CrudServiceImpl实现CrudService{
@PersistenceContext(unitName=“localmedecube”)
私人实体管理者;
公共CrudServiceImpl(){
//TODO自动生成的构造函数存根
}
@凌驾
公共T创建(T){
这个.em.persist(t);
这个.em.flush();
这个.em.refresh(t);
返回t;
}
@凌驾
public void delete(@SuppressWarnings(“rawtypes”)类类型,对象id){
@抑制警告(“未选中”)
Object ref=this.em.getReference(类型,id);
此.em.remove(参考);
}
@凌驾
公共T更新(T){
返回此.em.merge(t);
}
}
当我试图持久化我的地址实体时,它会给我这样的错误
原因:javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给的分离实体
持久化:model.Address
请告诉我为什么会出现这个例外。也请为我提供适当的答案。如果您已经使用
id=1
保留了一个地址
,则代码会中断。您必须为每个请求设置一个新的id
既然你已经用了
@GeneratedValue(strategy = IDENTITY)
private long id;
数据库应该为您设置id。先决条件是字段id
创建为自动递增字段
例如,在MySQL
中创建时设置自动递增字段
CREATE TABLE Persons
(
id int NOT NULL AUTO_INCREMENT,
<...>
PRIMARY KEY (ID)
)
创建表格人员
(
id int非空自动增量,
主键(ID)
)
如何尝试将其持久化。你可以共享crudService.create methodOk@xxlali我也共享CRUD代码。嗯,你使用persist方法。如我所知,若使用persist方法,则不应设置对象的id。请通过删除a.setId(1)重试代码>发布您的表定义。。。列名和类型。您设置了标识策略,因此通过删除a.setId(1),应该为“id”的列类型设置“AUTO_INCREMENT”或类似的内容。它将100%地将数据持久化到数据库中。您是对的。通过删除a.setId(1),代码可以正常工作。