Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在实体中使用嵌入类时传递给持久化的分离实体_Java_Jpa_Persistence - Fatal编程技术网

Java 在实体中使用嵌入类时传递给持久化的分离实体

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

如前所述,我正在阅读JPA(Java持久性API)。在那里我读到了关于可嵌入类的内容。所以,我试图在我的实体类中使用这个概念。但是在使用这个的时候,我面临着一个分离实体的问题

这里我在实体中有一个可嵌入类(ZipCode)

可嵌入类

@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),代码可以正常工作。