2016-06-13 20 views
5

ho strano problema quando cerco di entità di proprietà:Hibernate: Errore durante l'accesso campo [java.lang.Integer privato] per riflessione per la proprietà persistente

Hibernate: 
    select 
     tarifklsk0_.ID as ID1_12_0_, 
     tarifklsk0_.FK_TARIF as FK_TARIF2_12_0_, 
     tarifservp1_.FK_TARIF as FK_TARIF2_11_1_, 
     tarifservp1_.ID as ID1_11_1_, 
     tarifservp1_.ID as ID1_11_2_, 
     tarifservp1_.FK_TARIF as FK_TARIF2_11_2_, 
     tarifservp1_.N1 as N3_11_2_ 
    from 
     TR.TARIFXKLSK tarifklsk0_ 
    left outer join 
     TR.TARIF_SERV_PROP tarifservp1_ 
      on tarifklsk0_.FK_TARIF=tarifservp1_.FK_TARIF 
    where 
     tarifklsk0_.ID=? 
Jun 13, 2016 7:38:26 AM org.hibernate.event.internal.DefaultLoadEventListener doOnLoad 
INFO: HHH000327: Error performing load command : org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.Integer TarifKlsk.fkTarif] by reflection for persistent property [TarifKlsk#fkTarif] : 1027303 
Exception in thread "main" org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.Integer TarifKlsk.fkTarif] by reflection for persistent property [TarifKlsk#fkTarif] : 1027303 
    at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:43) 
    ....skipped... 
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Integer field TarifKlsk.fkTarif to java.lang.Integer 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)  

I miei soggetti:

TarifKlsk

import java.util.HashSet; 
import java.util.Set; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

import org.hibernate.annotations.BatchSize; 

@SuppressWarnings("serial") 
@Entity 
@Table(name = "TARIFXKLSK", schema="TR") 
public class TarifKlsk implements java.io.Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID", updatable = false, nullable = false) 
    private Integer id; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name="FK_TARIF", referencedColumnName="FK_TARIF") 
    @BatchSize(size = 50) 
    private Set<TarifServProp> tarifservprop = new HashSet<TarifServProp>(0); 

    @Column(name = "FK_TARIF", updatable = false, nullable = false) 
    private Integer fkTarif; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public Set<TarifServProp> getTarifservprop() { 
     return tarifservprop; 
    } 

    public void setTarifservprop(Set<TarifServProp> tarifservprop) { 
     this.tarifservprop = tarifservprop; 
    } 

    public Integer getFkTarif() { 
     return fkTarif; 
    } 

    public void setFkTarif(Integer fkTarif) { 
     this.fkTarif = fkTarif; 
    } 

} 

TarifServProp

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@SuppressWarnings("serial") 
@Entity 
@Table(name = "TARIF_SERV_PROP", schema="TR") 
public class TarifServProp implements java.io.Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID", updatable = false, nullable = false) 
    private Integer id; 

    @Column(name = "FK_TARIF", updatable = false, nullable = false) 
    private Integer fkTarif; 

    public Integer getId() { 
     return id; 
    } 

    @Column(name = "N1", updatable = false, nullable = false) 
    private Integer n1; 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public Integer getFkTarif() { 
     return fkTarif; 
    } 

    public void setFkTarif(Integer fkTarif) { 
     this.fkTarif = fkTarif; 
    } 

    public Integer getN1() { 
     return n1; 
    } 

    public void setN1(Integer n1) { 
     this.n1 = n1; 
    } 

} 

mio modulo di test:

public static void main(String[] args) { 
     SessionFactory sf = HibernateUtil.getSessionFactory(); 
     Session sess = sf.openSession(); 
     sess.beginTransaction(); 

     TarifKlsk k2=sess.get(TarifKlsk.class, 1027303); 
     for (TarifServProp t : k2.getTarifservprop()) { 
      System.out.println("Tar="+t.getN1()); 
     } 

     System.out.println("End init"); 

Che cosa sto facendo di sbagliato? Ho controllato tutti i campi di queste entità e tutti loro nome correttamente ....

UPdt mio pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.journaldev.hibernate</groupId> 
    <artifactId>HibernateEHCacheExample</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <description>Hibernate Secondary Level Cache Example using EHCache implementation</description> 

    <dependencies> 
     <!-- Hibernate Core API --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>5.1.0.Final</version> 
     </dependency> 
     <!-- EHCache Core APIs --> 
     <!-- http://mvnrepository.com/artifact/net.sf.ehcache/ehcache-core --> 
     <dependency> 
      <groupId>net.sf.ehcache</groupId> 
      <artifactId>ehcache-core</artifactId> 
      <version>2.6.11</version> 
     </dependency> 

     <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-ehcache</artifactId> 
      <version>5.2.0.Final</version> 
     </dependency> 

     <!-- EHCache uses slf4j for logging --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-simple</artifactId> 
      <version>1.7.5</version> 
     </dependency> 
    </dependencies> 
</project> 

UPD2

ho ho scoperto che la mia entità figlio non contiene record con fk_tarif corrispondente al fk_tarif dal master ... ma penso che non importi, perché esiste un errore?

+0

E 'così strano, ma quando ho impostato la versione Hibernate per 4.1.9.Final il mio codice funziona bene: ***** ***** Fetch Count = 0 Secondo Livello Hit Count = 0 Secondo Livello Miss Count = 0 Secondo conteggio Put Level = 0 Completo! Può esserci un bug nella versione di ibernazione versione superiore 4.1.9? – Lev

risposta

1

sto lavorando con EAP7, che contiene Hibernate Nucleo {5.0.9.Final-redhat-1}

ho due entità:

@Entity 
@Data 
@EqualsAndHashCode(callSuper = true, doNotUseGetters = true) 
@ToString(callSuper = true, doNotUseGetters = true) 
public class Keuze extends MainTable { 

@NonNull 
String naam; 

@Tolerate 
public Keuze() { 
} 

} 

e

@Entity 
@Data 
@EqualsAndHashCode(callSuper = true, doNotUseGetters = true, exclude = {"gegeven", "werkJaar", "keuze", "keuzes" }) 
@ToString(callSuper = true, doNotUseGetters = true, exclude = { "gegeven", "werkJaar", "keuze", "keuzes" }) 
public class Waarde extends MainTable { 

@NonNull 
@ManyToOne(optional = false, fetch = FetchType.LAZY) 
Gegeven gegeven; 

@NonNull 
@ManyToOne(optional = false, fetch = FetchType.LAZY) 
WerkJaar werkJaar; 

String alfanumeriek; 

Integer numeriek; 

BigDecimal valuta; 

@Lob 
String tekst; 

Boolean polair; 

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) 
Keuze keuze; 

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE) 
Set<Keuze> keuzes; 

@Tolerate 
public Waarde() { 
} 

} 

Entrambi estendono da questa classe:

@MappedSuperclass 
@Data 
@Cacheable 
public abstract class MainTable { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
Long id; 

@Version 
Long version; 

} 

Quando si chiama merge su Waarde, getta l'errore seguente:

Caused by: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [java.lang.Long vo.cjsm.monitoring.data.schema.dynamic.main.MainTable.id] by reflection for persistent property [vo.cjsm.monitoring.data.schema.dynamic.field.Keuze#id] : Keuze(super=MainTable(id=1, version=0), naam=Leesmotivatie) 
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:43) 
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:223) 
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4601) 
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:148) 
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:850) 
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:832) 
at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:260) 
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:398) 
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:162) 
at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:431) 
at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:363) 
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326) 
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:162) 
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:111) 
at org.hibernate.event.internal.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:468) 
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:327) 
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:170) 
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:69) 
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:840) 
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:822) 
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:827) 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:1161) 
... 149 more 
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field vo.cjsm.monitoring.data.schema.dynamic.main.MainTable.id to java.lang.String 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) 
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) 
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) 
at java.lang.reflect.Field.get(Field.java:393) 
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:39) 
... 171 more 

Rimuovendo la linea ToString di Lombok e aggiungendo la mia propria implementazione di toString l'override quello predefinito, il messaggio di errore è scomparso e il codice stava funzionando!

Ora l'entità assomiglia a questo:

@Entity 
@Data 
@EqualsAndHashCode(callSuper = true, doNotUseGetters = true) 
public class Keuze extends MainTable { 

@NonNull 
String naam; 

@Tolerate 
public Keuze() { 
} 

@Override 
public String toString() { 

    return getId().toString(); 
} 

} 

Così in qualche modo, per un motivo sconosciuto il metodo toString ha effetto su come Hibernate fonde il codice ... Non chiedetemi come :-) E 'solo sembra funzionare. Ho provato tutto il resto sul web senza fortuna!

Spero che questo aiuti per qualcun altro!

Problemi correlati