Hibernate: error accessing the [private java.lang.Integer] field by reflection for a constant function

I have a strange problem when I try to get the entity property:

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) 

My objects:

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

My test module:

  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"); 

What am I doing wrong? I checked all the fields of these objects and they are all correctly named ....

Updt My 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

I found out that my child object does not contain records with fk_tarif corresponding to fk_tarif from master ... but I think it doesnโ€™t matter, why does the error exist?

+5
source share
3 answers

This is a bug in versions 5.0 and 5.1.0 https://hibernate.atlassian.net/browse/HHH-10618

+2
source

I recommend that you continue to work with the sleeping version of version 4.XX instead of version 5, because it is not 100% stable ( more problems 2000 ).

https://hibernate.atlassian.net/projects/HHH/issues/HHH-11144?filter=allopenissues

Good luck.

+1
source

I work with EAP7 which contains Hibernate Core {5.0.9.Final-redhat-1}

I have two objects:

 @Entity @Data @EqualsAndHashCode(callSuper = true, doNotUseGetters = true) @ToString(callSuper = true, doNotUseGetters = true) public class Keuze extends MainTable { @NonNull String naam; @Tolerate public Keuze() { } } 

and

 @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() { } } 

Both of them extend from this class:

 @MappedSuperclass @Data @Cacheable public abstract class MainTable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; @Version Long version; } 

When calling merge on Waarde, this causes the following error:

 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 

By removing the ToString line from Lombok and adding my own toString implementation, overriding the default value, the error message disappeared and the code works!

Now the object is as follows:

 @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(); } } 

So for some reason, for some unknown reason, the toString method affects how hibernation combines code ... Donโ€™t ask me how :-) It seems to work. I tried everything else online with no luck!

Hope this helps someone else!

+1
source

All Articles