2017-10-17 9 views
0

私はNetbeanでアプリケーションを構築しようとしています。 Eclipse IDE & JPA APIを使用します。Ecplise JPA新しい親オブジェクトを追加する

NATS.java

@Entity 
@Table(name = "NATS") 
Public Class NATS implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer code; 
    private String nName; 
    @Column(name = "cap_id") // for foreign key purpose 
    private Integer capId; 
    @OneToOne(cascade=CascadeType.PERSIST) 
    @PrimaryKeyJoinColumn(name = "cap_id") 
    private City capital; 
    public City getCapital(){ 
     return this.capital; 
    } 
    public void setCapital (City newcapital){ 
     this.capital = newcapital; 
    } 
    ... some gets & sets methods 
} 

City.java

@Entity 
public class City implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private String cityName;  
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    private Integer cityId; 
    public String getCityName() { 
     return cityName; 
    } 
    public void setCityName(String newcityName) { 
     this.cityName = newcityName; 
    }  
    public City(String ctname) { 
     this.cityName = ctname; 
    } 
    public Integer getcityId() { 
     return cityId; 
    } 
    public void setcityId(Integer ctId) { 
     this.cityId = ctId; 
    } 

} 

私はNATS &市の新しいペアを追加したい場合は、私はこの使用します:

を企業はこのようなものですsomebean.java

@Stateless 
public class somebean { 
    @PersistenceContext(unitName = "TestLocal") 
    private EntityManager em; 

    public NATs insertNewCC(String capitalname, String countryname){ 
    City newcapital = new City(capitalname); 
    NATS newcountry = new NATS(); 
    newcountry.setNationName(countryname); 
    newcountry.setCapital(newcapital); 
    em.persist(newcountry); // both objects persisted well, with "capId" still null 
    return newcountry; 
    } 

    public void updateCapitalId(Nations country){ 
    country.setCapitalId(country.getCapital().getcityId()); 
    em.merge(country); 
    } 
} 
私は行をコメントすると

genericResource.java

@Path("generic") 
public class GenericResource { 

@Context 
private UriInfo context; 
@EJB 
private somebean r; 

@GET 
@Path("/inscountry") 
@Produces("application/json") 
public List<NATS> insCountry(@QueryParam("countryname") String countryname, @QueryParam("capitalname") String capitalname){  
    NATS newcountry = r.insertNewCC(capitalname, countryname); 
    //r.updateCapitalId(newcountry); <-- i want to avoid using this line 
    List<NATS> result= r.getListNATS(); 
    return result; 
} 

ここでは、サービスであるr.updateCapitalId(newcountry)。 JSONに正しく表示された関係を持つ国と首都のペアが取得されますが、セッションが終了すると外部キーが保存されないため、関係が失われます。 persistsが完了した後、NATエンティティのcapIDがnullになります。だから私は1を完了するために& 1をマージする必要があります。私はコメントしたその行を使用する横に良いソリューションがありますか? ありがとうございます。

+0

これはあなたのコードであるあなたは確かですか..?コンパイル&ネストしていないエンティティは非常に悪いことですが、エンティティごとに別々のクラスを持つことはできませんか? –

+0

異なる.javaファイルから引用されます。私は実際に各エンティティを別々のファイルに書きます。 –

答えて

0

このようなあなたのエンティティNATSを再設計:

package com; 

import java.io.Serializable; 

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 

@Entity 
@Table(name = "NATS") 

public class NATS 
    implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer code; 
    private String name; 
    // for foreign key purpose 
    @OneToOne(cascade = CascadeType.PERSIST) 
    @JoinColumn(name = "cap_id") 
    private City capital; 

    public City getCapital() 
    { 
     return this.capital; 
    } 

    public void setCapital(City newcapital) 
    { 
     this.capital = newcapital; 
    } 

    public Integer getCode() 
    { 
     return this.code; 
    } 

    public void setCode(Integer code) 
    { 
     this.code = code; 
    } 

    public String getName() 
    { 
     return this.name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 
} 

して、実行のためのコードは同じままになります:

City newcapital = new City(capitalname); 
    NATS newcountry = new NATS(); 
    newcountry.setName(countryname); 
    newcountry.setCapital(newcapital); 
    this.entityManager.persist(newcountry); 
+0

あなたが観察するならば、私はNATS.javaからcap_id明示的な変数を削除し、注釈を変更して、期待どおりに動作します。 – Tejas

+0

また、City.javaにデフォルトコンストラクタを1つ追加する必要があります。 – Tejas

+0

ありがとうございます。これは私が探していたものです。 –

0

まず、インデントとフォーマッタは、コードが混乱しているために使用してください。 2つ目のエンティティ(NATSと国)を保存したいので、都市を更新する行をコメント解除するか、1つずつ更新する必要があります。新しいアプリケーションを起動する場合は、Springブートを使用することをお勧めします。また、SpringRepositoryインターフェイスを使用すると、こうした種類の作業をより簡単かつ明確にすることができます。

+1

ありがとうございました。私はNATSエンティティにIDを追加しました。これは、より良い識別が必要な唯一の部分です。 "update capitalId"の部分を残しておいてほしいと思っています。私は本当にあなたの答えに感謝します。 :) –

関連する問題