2016-12-29 16 views
3

Как, я читаю JPA (Java Persistence API). Там я читал о встраиваемых классах. Итак, я пытаюсь использовать эту концепцию в классе сущности. Но при использовании этого я столкнулся с проблемой отдельного объекта.Отдельный объект, переданный для сохранения при использовании встроенного класса в объекте

Здесь у меня есть Embeddable Class (ZipCode) в Entity.

Встраиваемый Класс

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

//getter & setter also. 
} 

Entity Класс

@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

Ok @xxlali и общий код CRUD. –

+1

hmm, вы используете persist способ. Как я знаю, вы не должны устанавливать id объекта, если используете метод persist. Повторите попытку, удалив 'a.setId (1);' – xxlali

ответ

1

Если у вас уже есть Address с id = 1, тогда ваш код будет выключаться. Вы должны установить по каждому запросу новый id.

Поскольку вы используете уже

@GeneratedValue(strategy = IDENTITY) 
private long id; 

база данных должна установить идентификатор для вас. Предпосылками для этого является то, что поле id было создано как поле с автоматическим приращением.

Например, установив поле автоинкремента при создании в MySQL.

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

Вы правы. Удалив код a.setId (1), он будет работать нормально. –

+0

спасибо за ваше решение. –

+0

Добро пожаловать. –