2016-12-29 11 views
3

私はJPA(Java Persistence 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. 

} 

私の永続コード:

@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

あなたはpersistメソッドを使用します。私が知っているように、永続メソッドを使用する場合は、オブジェクトのidを設定しないでください。 'a.setId(1);' – xxlali

答えて

1

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

あなたは正しいです。 a.setId(1)コードを削除することで正常に動作します。 –

+0

あなたのソリューションに感謝します。 –

+0

ようこそ。 –

関連する問題