it-swarm.com.ru

Hibernate: Ошибка доступа к полю [private Java.lang.Integer] по отражению для постоянного свойства

У меня странная проблема, когда я пытаюсь получить свойство лица:

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)       

Мои сущности:

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

}

Мой тестовый модуль:

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

Что я делаю неправильно? Я проверил все поля этих объектов, и все они названы правильно ....

Обновление Мой 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

Я обнаружил, что мой дочерний объект не содержит записей с fk_tarif, соответствующих fk_tarif от master ... но я думаю, что это не имеет значения, почему существует ошибка? 

12
Lev

Это ошибка в версии 5.0 и 5.1.0 https://hibernate.atlassian.net/browse/HHH-10618

2
AlexankrKotov

Я работаю с EAP7, который содержит Hibernate Core {5.0.9.Final-redhat-1}

У меня есть две сущности:

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

@NonNull
String naam;

@Tolerate
public Keuze() {
}

}

а также

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

}

Они оба выходят из этого класса:

@MappedSuperclass
@Data
@Cacheable
public abstract class MainTable {

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

@Version
Long version;

}

При вызове слияния на Waarde выдает следующую ошибку:

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

Удалив строку ToString в Lombok и добавив мою собственную реализацию toString, переопределив стандартную, сообщение об ошибке исчезло, и код снова начал работать!

Теперь сущность выглядит так:

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

}

Так или иначе, по неизвестной причине метод toString влияет на то, как hibernate объединяет код ... Не спрашивайте меня, как :-) Кажется, он просто работает. Я попробовал все остальное в Интернете без удачи!

Надеюсь, это поможет кому-то еще!

2
Fabi Yo

Я советую вам продолжать работать с версией 4.X.X гибернации вместо версии 5, потому что она не стабильна на 100% (более 2000 выпусков).

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

Удачи

1
Anas Lachheb

В моем случае проблема была в том, что в моей модели сеттер был сгенерирован автоматически 

public void setComments(List comments){
}

без типа. Исправил это, установив его на List<Comment> comments

0
Alex Arvanitidis