Guten Tag,
ich bin gerade ein wenig am Verzweifeln weil und wäre dankbar wenn mir jemand helfen könnte.
Ich nutze eine PostgreSQL Datenbank, Payara5 und Eclipselink.
Die Entitys habe ich mir mit JPA aus den Tabellen generieren lassen.
Ich versuche gerade eine Rest-Schnittstelle zu programmieren. Eigendlich klappt es auch ganz gut - so ziemlich zur Hälfte ganz gut. Wenn ich versuche die Daten mit nem GET-request auszulesen zeigt er so ca die Hälfte korrekt an, die andere Hälfte sind Null-Werte.
Hier mal der Code:
TestRessource
Test Entity:
TestPK:
TestDAO:
EntityManagerProducer:
SingletonService Interface:
Die Felder sind in der Datenbank definitiv gefüllt, aber die Hälfte kommt nur als Null-Wert an.
Ich habe diverse Dinge ausprobiert mit @XMLElement und -Attribute, dann hab ich das wie man sieht als String ausgegeben. Da werden die Nullwerte halt auch als Nullwerte angezeigt.
@Column(name="columnName") habe ich auch bei allen schon ausprobiert.
Der Primärschlüssel hat übrigens mit @EmbeddedId nicht funtioniert, also habe ich jetzt die andere Variante ausprobiert und siehe da! Der PK funktioniert! Keine Ahnung warum.
Ich habe Long schon in BigInteger (Ist BigInt bzw int8 in der Datenbank) und Bid Decimal umgeschrieben. Da String funktionieren, Long aber nicht dachte ich dass es am mapping des Datentyps liegt. Date wird aber auch als NullWert angezeigt.
Nachdem ich jetzt gefühlt drei Tage alles Erdenkliche ausprobiert habe was ich so in den weiten des Internets gefunden habe bin ich mit meinem Latein am Ende :/
Wenn jemand weiß wie man den Datentyp tsrange von PostgreSQL richtig mappt da wäre ich auch sehr dankbar wenn mir da jemand weiter helfen könnte.
Vielen Dank schonmal im vorraus
Asperah
ich bin gerade ein wenig am Verzweifeln weil und wäre dankbar wenn mir jemand helfen könnte.
Ich nutze eine PostgreSQL Datenbank, Payara5 und Eclipselink.
Die Entitys habe ich mir mit JPA aus den Tabellen generieren lassen.
Ich versuche gerade eine Rest-Schnittstelle zu programmieren. Eigendlich klappt es auch ganz gut - so ziemlich zur Hälfte ganz gut. Wenn ich versuche die Daten mit nem GET-request auszulesen zeigt er so ca die Hälfte korrekt an, die andere Hälfte sind Null-Werte.
Hier mal der Code:
TestRessource
Java:
package services;
import java.sql.Timestamp;
import java.util.List;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import controller.TestDAO;
import model.Test;
@Path("/test")
public class TestRessource {
@Inject
TestDAO corapD;
@Path("/gettest")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getCorap() {
List<Test> test = corapD.getTest();
String scorap = "";
Long id = 22L;
Long testLong = 24L;
Long status= 23L;
Timestamp buchzeitstempel;
for (Test item: test) {
if (item.getStatus() != null) {
status = item.getStatus();
}
else status = 43L;
System.out.println("Status: "+ status);
testLong = item.getTestLong();
if (testLong == null) scorap += "Stoffmain_id is null! ";
else scorap += "Stoffmain_id ist not null! ";
testLong = item.getTestLong();
buchzeitstempel = item.getBuchzeitstempel();
scorap += "Id: "+id+", Jahr: "+item.getJahr()+", Buchzeitstempel: "+buchzeitstempel+", Authority: "+item.getAuthority()+ ", Status: " +status+ item.getStatus()+", "+"Buchperson: "+item.getBuchperson()+", Grounds_for_Concern: "+item.getGrounds()+", StoffmainId: "+testLong+"\n";
};
return scorap;
}
@Path("/gettest2")
@GET
@Produces(MediaType.APPLICATION_XML)
public List<Test> getCor2() {
List<Test> corap = corapD.getTest();
return corap;
}
}
Test Entity:
Java:
package model;
import java.io.Serializable;
import java.sql.Timestamp;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;
import rangetype.TSRange;
import java.sql.Date;
@XmlRootElement
@IdClass(TestPK.class)
@Entity
@Table(name="Test", schema="public")
@NamedQuery(name="Test.findAll", query="SELECT c FROM Test c")
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id; //funktioniert soweit
@Id
private Timestamp buchzeitstempel; //funktioniert auch
public Timestamp getBuchzeitstempel() {
return buchzeitstempel;
}
public void setBuchzeitstempel(Timestamp buchzeitstempel) {
this.buchzeitstempel = buchzeitstempel;
}
private String authority; //funktioniert
private String buchperson; //jupp wird ausgegeben
@Column(name="grounds")
private Long grounds; //gibt einen nullwert aus (in der Datenbank sind aber definitiv keine Nullwerte drin!)
//@Embedded
@Column(name="gueltigkeitszeitraum")
private TSRange gueltigkeitszeitraum; //'TSRange' ist noch ein weiteres Problem, dazu gleich mehr
private Date jahr; //funktioniert nicht, nullwert wird ausgegeben
@Column(name="status",columnDefinition="int8")
private Long status; //funktioniert nicht, nullwert wird ausgegeben
private Long testLong; //funktioniert nicht, nullwert wird ausgegeben
public Test() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getAuthority() {
return this.authority;
}
public void setAuthority(String authority) {
this.authority = authority;
}
public String getBuchperson() {
return this.buchperson;
}
public void setBuchperson(String buchperson) {
this.buchperson = buchperson;
}
public Long getGrounds() {
return this.grounds;
}
public void setGrounds(Long grounds) {
this.grounds = grounds;
}
public TSRange getGueltigkeitszeitraum() {
return this.gueltigkeitszeitraum;
}
public void setGueltigkeitszeitraum(TSRange gueltigkeitszeitraum) {
this.gueltigkeitszeitraum = gueltigkeitszeitraum;
}
public Date getJahr() {
return this.jahr;
}
public void setJahr(Date jahr) {
this.jahr = jahr;
}
public Long getStatus() {
return this.status;
}
public void setStatus(Long status) {
this.status = status;
}
public Long getTestLong() {
return this.testLong;
}
public void setTestLong(Long TestLong) {
this.testLong = TestLong;
}
}
TestPK:
Code:
package model;
import java.io.Serializable;
import java.sql.Timestamp;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@Embeddable
public class TestPK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;
@Column(name="id")
private Long id;
@Column(name="buchzeitstempel")
private Timestamp buchzeitstempel;
public TestPK() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public Timestamp getBuchzeitstempel() {
return this.buchzeitstempel;
}
public void setBuchzeitstempel(Timestamp buchzeitstempel) {
this.buchzeitstempel = buchzeitstempel;
}
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof TestPK)) {
return false;
}
TestPK castOther = (TestPK)other;
return
this.id.equals(castOther.id)
&& this.buchzeitstempel.equals(castOther.buchzeitstempel);
}
public int hashCode() {
final int prime = 31;
int hash = 17;
hash = hash * prime + this.id.hashCode();
hash = hash * prime + this.buchzeitstempel.hashCode();
return hash;
}
}
TestDAO:
Java:
package controller;
import java.util.List;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import model.Test;
import shared.SingletonService;
@SingletonService
public class TestDAO {
@Inject
private EntityManager entityManager;
public TestDAO() {};
public List<Test> getTest(){
TypedQuery<Test> testListe = entityManager.createQuery("SELECT c FROM Test c", Test.class);
return testListe.getResultList();
}
public void save(Test t) {
entityManager.persist(t);
}
}
EntityManagerProducer:
Java:
package shared;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.*;
import javax.persistence.*;
@ApplicationScoped
public class EntityManagerProducer {
@Produces
@Default
@PersistenceContext(unitName="sistestdb")
private EntityManager em;
}
SingletonService Interface:
Java:
package shared;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Stereotype;
import javax.inject.Named;
import javax.transaction.Transactional;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Stereotype
@ApplicationScoped
@Transactional
@Named
public @interface SingletonService {
}
Die Felder sind in der Datenbank definitiv gefüllt, aber die Hälfte kommt nur als Null-Wert an.
Ich habe diverse Dinge ausprobiert mit @XMLElement und -Attribute, dann hab ich das wie man sieht als String ausgegeben. Da werden die Nullwerte halt auch als Nullwerte angezeigt.
@Column(name="columnName") habe ich auch bei allen schon ausprobiert.
Der Primärschlüssel hat übrigens mit @EmbeddedId nicht funtioniert, also habe ich jetzt die andere Variante ausprobiert und siehe da! Der PK funktioniert! Keine Ahnung warum.
Ich habe Long schon in BigInteger (Ist BigInt bzw int8 in der Datenbank) und Bid Decimal umgeschrieben. Da String funktionieren, Long aber nicht dachte ich dass es am mapping des Datentyps liegt. Date wird aber auch als NullWert angezeigt.
Nachdem ich jetzt gefühlt drei Tage alles Erdenkliche ausprobiert habe was ich so in den weiten des Internets gefunden habe bin ich mit meinem Latein am Ende :/
Wenn jemand weiß wie man den Datentyp tsrange von PostgreSQL richtig mappt da wäre ich auch sehr dankbar wenn mir da jemand weiter helfen könnte.
Vielen Dank schonmal im vorraus
Asperah