[Hibernate] One-To-One Beziehung = NullPointerException

jimb0p

Erfahrenes Mitglied
Hallo Zusammen,

versuche aktuell die Tabellen tartikel und teigenschaft miteinander zu verknüpfen. Ein Artikel hat eine Eigenschaft. Dies wird in der Tabelle teigenschaft über den Primärschlüssel kArtikel aus tartikel gemacht. In teigenschaft ist kArtikel aber kein Fremdschlüssel sondern einfach ein Attribut.

Hier mein Ausschnitt aus tartikel:

Java:
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "kArtikel", referencedColumnName="kArtikel")
    public TeigenschaftEntity getTeigenschaftEntity() {
        return teigenschaftEntity;
    }

    public void setTeigenschaftEntity(TeigenschaftEntity teigenschaftEntity) {
        this.teigenschaftEntity = teigenschaftEntity;
    }

Hier die komplette Entität von teigenschaft:

Java:
@Entity
@Table(name = "teigenschaft", schema = "dbo", catalog = "Mandant_EinsZwei")
public class TeigenschaftEntity {

    private int kEigenschaft;
    private int kArtikel;
    private String cWaehlbar;
    private Integer nSort;
    private String cTyp;
    private String cAktiv;

    @Id
    @Column(name = "kEigenschaft")
    public int getkEigenschaft() {
        return kEigenschaft;
    }

    public void setkEigenschaft(int kEigenschaft) {
        this.kEigenschaft = kEigenschaft;
    }

    @Basic
    @Column(name = "kArtikel")
    public int getkArtikel() {
        return kArtikel;
    }

    public void setkArtikel(int kArtikel) {
        this.kArtikel = kArtikel;
    }

    @Basic
    @Column(name = "cWaehlbar")
    public String getcWaehlbar() {
        return cWaehlbar;
    }

    public void setcWaehlbar(String cWaehlbar) {
        this.cWaehlbar = cWaehlbar;
    }

    @Basic
    @Column(name = "nSort")
    public Integer getnSort() {
        return nSort;
    }

    public void setnSort(Integer nSort) {
        this.nSort = nSort;
    }

    @Basic
    @Column(name = "cTyp")
    public String getcTyp() {
        return cTyp;
    }

    public void setcTyp(String cTyp) {
        this.cTyp = cTyp;
    }

    @Basic
    @Column(name = "cAktiv")
    public String getcAktiv() {
        return cAktiv;
    }

    public void setcAktiv(String cAktiv) {
        this.cAktiv = cAktiv;
    }

}

Die Daten für tartikel erhalte ich. Wenn ich aber auf das Objekt von teigenschaft zugreifen möchte, erhalte ich einen Nullpointer. Sieht jemand wo ich den Fehler gemacht habe?

Beste Grüße!
 
Ah sorry, wichtigsten Teil vergessen:

Java:
private static void createSession(){
        if (session == null || !session.isOpen()) {
            session = sessionManager.getSession();
        }
    }

    public static void main(final String[] args) throws Exception {
        createSession();
        Helper helper = new Helper();
        session.beginTransaction();
        TArtikelEntity tArtikelEntity = session.get(TArtikelEntity.class, 189820);
        System.out.println(tArtikelEntity.toString());
        System.out.println(tArtikelEntity.getTeigenschaftEntity().getkEigenschaft()+" <---- kEigenschaft");

        session.getTransaction().commit();
}

Und hier der komplette Output:
Code:
Jul 28, 2017 12:38:51 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.10.Final}
Jul 28, 2017 12:38:51 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Jul 28, 2017 12:38:52 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Jul 28, 2017 12:38:52 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Jul 28, 2017 12:38:52 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.p6spy.engine.spy.P6SpyDriver] at URL [jdbc:p6spy:sqlserver://localhost\MSSQLSERVER:37084;databaseName=Mandant_EinsZwei]
Jul 28, 2017 12:38:52 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=sa, password=****}
Jul 28, 2017 12:38:52 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Jul 28, 2017 12:38:52 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Jul 28, 2017 12:38:54 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
Hibernate:
    select
        tartikelen0_.kArtikel as kArtikel1_1_0_,
        tartikelen0_.cAktiv as cAktiv2_1_0_,
        tartikelen0_.cAmazonFNSKU as cAmazonF3_1_0_,
        tartikelen0_.cAnmerkung as cAnmerku4_1_0_,
        tartikelen0_.cArtNr as cArtNr5_1_0_,
        tartikelen0_.cASIN as cASIN6_1_0_,
        tartikelen0_.cBarcode as cBarcode7_1_0_,
        tartikelen0_.cDelInet as cDelInet8_1_0_,
        tartikelen0_.cEPID as cEPID9_1_0_,
        tartikelen0_.cErloeskonto as cErloes10_1_0_,
        tartikelen0_.cGefahrnr as cGefahr11_1_0_,
        tartikelen0_.cHAN as cHAN12_1_0_,
        tartikelen0_.cHerkunftsland as cHerkun13_1_0_,
        tartikelen0_.cInet as cInet14_1_0_,
        tartikelen0_.cISBN as cISBN15_1_0_,
        tartikelen0_.cJfpid as cJfpid16_1_0_,
        tartikelen0_.cLagerAktiv as cLagerA17_1_0_,
        tartikelen0_.cLagerArtikel as cLagerA18_1_0_,
        tartikelen0_.cLagerKleinerNull as cLagerK19_1_0_,
        tartikelen0_.cLagerVariation as cLagerV20_1_0_,
        tartikelen0_.cNeu as cNeu21_1_0_,
        tartikelen0_.cPreisliste as cPreisl22_1_0_,
        tartikelen0_.cSerie as cSerie23_1_0_,
        tartikelen0_.cSuchbegriffe as cSuchbe24_1_0_,
        tartikelen0_.cTaric as cTaric25_1_0_,
        tartikelen0_.cTeilbar as cTeilba26_1_0_,
        tartikelen0_.cTopArtikel as cTopArt27_1_0_,
        tartikelen0_.cUNNummer as cUNNumm28_1_0_,
        tartikelen0_.cUPC as cUPC29_1_0_,
        tartikelen0_.dErscheinungsdatum as dErsche30_1_0_,
        tartikelen0_.dErstelldatum as dErstel31_1_0_,
        tartikelen0_.dLetzterEK as dLetzte32_1_0_,
        tartikelen0_.dMod as dMod33_1_0_,
        tartikelen0_.dNeuImSortiment as dNeuImS34_1_0_,
        tartikelen0_.dZulaufVerfuegbarAm as dZulauf35_1_0_,
        tartikelen0_.fAbnahmeintervall as fAbnahm36_1_0_,
        tartikelen0_.fAmazonVK as fAmazon37_1_0_,
        tartikelen0_.fArtGewicht as fArtGew38_1_0_,
        tartikelen0_.fBreite as fBreite39_1_0_,
        tartikelen0_.fEbayPreis as fEbayPr40_1_0_,
        tartikelen0_.fEKNetto as fEKNett41_1_0_,
        tartikelen0_.fGewicht as fGewich42_1_0_,
        tartikelen0_.fGrundpreisMenge as fGrundp43_1_0_,
        tartikelen0_.fHoehe as fHoehe44_1_0_,
        tartikelen0_.fLaenge as fLaenge45_1_0_,
        tartikelen0_.fLetzterEK as fLetzte46_1_0_,
        tartikelen0_.fMassMenge as fMassMe47_1_0_,
        tartikelen0_.fPackeinheit as fPackei48_1_0_,
        tartikelen0_.fUVP as fUVP49_1_0_,
        tartikelen0_.fVKNetto as fVKNett50_1_0_,
        tartikelen0_.fVPEWert as fVPEWer51_1_0_,
        tartikelen0_.kBenutzerLetzteAenderung as kBenutz52_1_0_,
        tartikelen0_.kEigenschaftKombi as kEigens53_1_0_,
        tartikelen0_.kGrundPreisEinheit as kGrundP54_1_0_,
        tartikelen0_.kHersteller as kHerste55_1_0_,
        tartikelen0_.kLieferStatus as kLiefer56_1_0_,
        tartikelen0_.kMassEinheit as kMassEi57_1_0_,
        tartikelen0_.kSteuerklasse as kSteuer58_1_0_,
        tartikelen0_.kStueckliste as kStueck59_1_0_,
        tartikelen0_.kVaterArtikel as kVaterA60_1_0_,
        tartikelen0_.kVerkaufsEinheit as kVerkau61_1_0_,
        tartikelen0_.kVersandklasse as kVersan62_1_0_,
        tartikelen0_.kVPEEinheit as kVPEEin63_1_0_,
        tartikelen0_.kWarengruppe as kWareng64_1_0_,
        tartikelen0_.kZustand as kZustan65_1_0_,
        tartikelen0_.nAutomatischeLiefertageberechnung as nAutoma66_1_0_,
        tartikelen0_.nBearbeitungszeit as nBearbe67_1_0_,
        tartikelen0_.nCharge as nCharge68_1_0_,
        tartikelen0_.nDelete as nDelete69_1_0_,
        tartikelen0_.nEbayAbgleich as nEbayAb70_1_0_,
        tartikelen0_.nIstMindestbestand as nIstMin71_1_0_,
        tartikelen0_.nIstVater as nIstVat72_1_0_,
        tartikelen0_.nLagerbestand as nLagerb73_1_0_,
        tartikelen0_.nLiefertageWennAusverkauft as nLiefer74_1_0_,
        tartikelen0_.nMHD as nMHD75_1_0_,
        tartikelen0_.nMidestbestand as nMidest76_1_0_,
        tartikelen0_.nMindestbestellmaenge as nMindes77_1_0_,
        tartikelen0_.nNichtBestellbar as nNichtB78_1_0_,
        tartikelen0_.nPaketlaufzeitMax as nPaketl79_1_0_,
        tartikelen0_.nPaketlaufzeitMin as nPaketl80_1_0_,
        tartikelen0_.nProzentualePreisStaffelAktiv as nProzen81_1_0_,
        tartikelen0_.nPuffer as nPuffer82_1_0_,
        tartikelen0_.nPufferTyp as nPuffer83_1_0_,
        tartikelen0_.nSeriennummernVerfolgung as nSerien84_1_0_,
        tartikelen0_.nSort as nSort85_1_0_,
        tartikelen0_.nVPE as nVPE86_1_0_,
        tartikelen0_.nZulaufVerfuegbarMenge as nZulauf87_1_0_
    from
        Mandant_EinsZwei.dbo.tArtikel tartikelen0_
    where
        tartikelen0_.kArtikel=?
Hibernate:
    select
        teigenscha0_.kEigenschaft as kEigensc1_12_0_,
        teigenscha0_.cAktiv as cAktiv2_12_0_,
        teigenscha0_.cTyp as cTyp3_12_0_,
        teigenscha0_.cWaehlbar as cWaehlba4_12_0_,
        teigenscha0_.kArtikel as kArtikel5_12_0_,
        teigenscha0_.nSort as nSort6_12_0_
    from
        Mandant_EinsZwei.dbo.teigenschaft teigenscha0_
    where
        teigenscha0_.kEigenschaft=?
TArtikelEntity{kArtikel=189820, cArtNr='10513', nIstVater=1}
Exception in thread "main" java.lang.NullPointerException
Hibernate:
    at Main.main(Main.java:36)
    select
        teigenscha0_.kEigenschaft as kEigensc1_12_0_,
        teigenscha0_.cAktiv as cAktiv2_12_0_,
        teigenscha0_.cTyp as cTyp3_12_0_,
        teigenscha0_.cWaehlbar as cWaehlba4_12_0_,
        teigenscha0_.kArtikel as kArtikel5_12_0_,
        teigenscha0_.nSort as nSort6_12_0_
    from
        Mandant_EinsZwei.dbo.teigenschaft teigenscha0_
    where
        teigenscha0_.kEigenschaft=?

Mache ich es schrittweise manuell, komme ich an die Daten:

Java:
        createSession();
        Helper helper = new Helper();
        session.beginTransaction();
        TArtikelEntity tArtikelEntity = session.get(TArtikelEntity.class, 189820);
        System.out.println(tArtikelEntity.toString());
        System.out.println(tArtikelEntity.getkArtikel());
        Query query = session.createQuery("from TeigenschaftEntity where kArtikel = :kArtikel");
        query.setParameter("kArtikel", tArtikelEntity.getkArtikel());
        List<TeigenschaftEntity> list = query.list();
        System.out.println(list.get(0).getkEigenschaft()+" <---- kEigenschaft");
        session.getTransaction().commit();

Aber ich möchte natürlich dass die Daten mit einem mal geholt werden und wenn ich es richtig verstanden habe, dann werden die Daten bei FetchType.LAZY erst geholt sobald danach gefragt wird oder? Ich möchte quasi keinen extra Code wenn ich die Klassen in Beziehung setzen kann.
 
Zuletzt bearbeitet:
Ist es eventuell notwendig, dass die Spalte als Fremdschlüssel deklariert ist? Mit P6Spy habe ich den genauen Query mal analysiert. Hier sehe ich auch das Problem warum TeigenschaftEntity null ist:

SQL:
select teigenscha0_.kEigenschaft as kEigensc1_12_0_, teigenscha0_.cAktiv as cAktiv2_12_0_, teigenscha0_.cTyp as cTyp3_12_0_, teigenscha0_.cWaehlbar as cWaehlba4_12_0_, teigenscha0_.kArtikel as kArtikel5_12_0_, teigenscha0_.nSort as nSort6_12_0_ from Mandant_EinsZwei.dbo.teigenschaft teigenscha0_ where teigenscha0_.kEigenschaft=?|select teigenscha0_.kEigenschaft as kEigensc1_12_0_, teigenscha0_.cAktiv as cAktiv2_12_0_, teigenscha0_.cTyp as cTyp3_12_0_, teigenscha0_.cWaehlbar as cWaehlba4_12_0_, teigenscha0_.kArtikel as kArtikel5_12_0_, teigenscha0_.nSort as nSort6_12_0_ from Mandant_EinsZwei.dbo.teigenschaft teigenscha0_ where teigenscha0_.kEigenschaft=189820

Und zwar nimmt er den Wert 189820 für das Attribut kEigenschaft. Jedoch soll er es für das Attribut kArtikel in der teigenschaft Tabelle nehmen. Oben seht ihr ja meinen Code und da definiere ich ja die JoinColumn auf kArtikel. Irgendwo hier scheint der Fehler zu liegen.
 
Zuletzt bearbeitet:
Ich habe den Fetch Type mal entfernt und erhalte jetzt einen kompletten JOIN, allerdings immer noch über das falsche Attribut, hier der Ausschnitt vom JOIN
SQL:
left outer join Mandant_EinsZwei.dbo.teigenschaft teigenscha1_ on tartikelen0_.kArtikel=teigenscha1_.kEigenschaft where tartikelen0_.kArtikel=189820
auch hier wird wieder der PK von teigenschaft genommen anstatt kArtikel.
 
Zurück