2017-10-17 37 views
0

Ich versuche eine Anwendung mit Netbean zu erstellen. Ich benutze Eclipse IDE & JPA API. die Entitäten ist wie folgt:JPA erweitern Hinzufügen eines neuen übergeordneten Objekts

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

} 

Wenn ich neues Paar NATS & Stadt hinzufügen möchten, ich benutze diese:

somebane.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); 
    } 
} 

Hier ist der Service: r.updateCapitalId (newCountry):

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

Wenn ich die Zeile Kommentar Ich bekomme ein Paar von Land und Hauptstadt mit einer Beziehung in JSON korrekt angezeigt, aber wenn die Sitzung geschlossen wird. Es verliert die Beziehung, weil der Fremdschlüssel nicht gespeichert wird. Die Entität capId in NATs ist null, nachdem persist abgeschlossen wurde. Also brauche ich 1 persist & 1 merge, um dies zu vervollständigen. Gibt es eine bessere Lösung neben der Verwendung der Zeile, die ich kommentiert habe? Danke.

+0

sind Sie sicher, das Ihr Code ist ..? Es sieht so aus, als wäre es nicht einmal eine Kompilierung und Verschachtelung von Entitäten. Das ist eine sehr schlechte Sache. Können Sie nicht separate Klassen für jede Entität haben? –

+0

wird aus verschiedenen .java-Dateien zitiert. Ich schreibe tatsächlich jede Entitäten in verschiedenen Dateien. –

Antwort

0

Redesign Ihr Unternehmen NATS wie folgt aus:

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

und dann Code zur Ausführung bleiben gleich:

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

Wenn Sie beobachten, habe ich explizite Variable cap_id aus NATS.java entfernt und Annotation ändern, und es wird funktionieren, wie Sie erwarten. – Tejas

+0

Fügen Sie City.java außerdem einen Standardkonstruktor hinzu, da dies erforderlich ist. – Tejas

+0

Danke. Das ist, wonach ich gesucht habe. –

0

Versuchen Sie zuerst, Einzüge und einen Formatierer zu verwenden, weil Ihr Code ein Durcheinander ist. Zweitens möchten Sie zwei Entitäten (NATS und Land) speichern, so dass Sie die Zeile, in der Sie die Stadt aktualisieren oder die Liste einzeln beibehalten möchten, auskommentieren müssen. Wenn Sie eine neue Anwendung starten, empfehle ich Ihnen, Spring Boot und SpringRepository Interface zu verwenden, um diese Art von Dingen einfacher und klarer zu machen.

+1

Vielen Dank für Ihre Antwort. Ich habe Identität auf NATS-Entität hinzugefügt, das ist der einzige Teil, den ich gefunden habe, der bessere Identifikation benötigt. Ich nehme an, dass Sie mir vorschlagen, den "update capitalId" -Teil beizubehalten. Ich schätze deine Antwort sehr. :) –

Verwandte Themen