java - 在实体中使用嵌入式类时传递的分离实体保持不变

标签 java jpa persistence

作为,我正在阅读 JPA(Java 持久性 API)。在那里我读到了可嵌入类。所以,我试图在我的实体类中使用这个概念。但是在使用它时我面临着分离实体的问题。

这里我在实体中有可嵌入类(邮政编码)。

可嵌入类

@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);
}

当我尝试保留我的 Address 实体时,它给我这样的错误

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)
)

关于java - 在实体中使用嵌入式类时传递的分离实体保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41375054/

相关文章:

java - 在 lambda foreach 表达式 java 8 中获取索引

java - 如何定位我的按钮?

java - JPA QueryDSL 按天计数聚合

java - 持久性、oracle Thin、ORA-12505、TNS 监听器当前不知道 SID

Java继承: is the parent class instantiantiated every time a child class extends it?

java - 如何使使用 '&' 指定的颜色代码的用户输入的消息在游戏中显示为彩色?

mysql - EclipseLink (JPA 2.1) 查询未返回明显应该返回的结果

java - 在 JPA 实体上查找声明的 java.util.Map 字段的泛型类型时出现 ClassNotFoundException (GlassFish 3)

java - 可以在 Gigaspaces XAP 8 中不使用 SQL 来保存数据吗?

java - Google App Engine 数据存储远程集成