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.
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? –
wird aus verschiedenen .java-Dateien zitiert. Ich schreibe tatsächlich jede Entitäten in verschiedenen Dateien. –