为什么在实体中看到JPA中的List(@OneToMany)与PersistentBag

时间:2018-09-21 13:33:21

标签: jpa orm spring-data-jpa persistent

我有两个实体,如下所示:Personel.java和PersonelEgitimDurum.java 如下所示,列出personelEgitimDurumList是Personel中的PersistentBag;

[enter image description here][1] 


  [1]: https://i.stack.imgur.com/Q3IC2.png

Personel.java如下;

    @Entity
@Table(name="personel")
public class Personel extends BaseEntity {

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="kisi_id")
    private Kisi kisi;

    @Column(name="personel_tipi",length = 2,nullable = false)
    private int personelTipi;

    @Column(name="sicil_no",length = 100,nullable = false)
    private String sicilNo;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "personel", cascade =CascadeType.ALL,orphanRemoval = true)
    private List<PersonelEgitimDurum> personelEgitimDurumList= new ArrayList<PersonelEgitimDurum>();

    @Column(name="khk_onay",length = 1)
    private int khkOnay;
}

PersonelEgitimDurum.java如下;

    @Entity
@Table(name = "personel_egitim_durum", indexes = {@Index(name = "index_personel_egitim_durum", columnList = "id")})
public class PersonelEgitimDurum extends BaseEntity {

    @ManyToOne(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
    @JoinColumn(name="personel_id",nullable = false, updatable = true)
    private Personel personel;

    @Column(name = "ogrenim_durumu")
    private String ogrenimDurumu;

    @Column(name = "okul_id", length = 3)
    private Long okulId;

    @Column(name = "universite_bolum_id", length = 4)
    private Long universiteBolumId;

    @Column(name = "mezuniyet_tarihi")
    private Date mezuniyetTarihi;

    @Column(name = "aciklama", length = 500)
    private String aciklama;
}

PersonelServiceImpl.java如下;

@Service
@Transactional
public class PersonelServiceImpl implements PersonelService {
@Override
    public PersonelDTO findPersonelByKimlikNo(String kimlikNo) {
        Kisi kisi=kisiDAO.findKisiByKimlikNo(kimlikNo);
        Personel personel=personelDao.findPersonelByKisi(kisi);
        PersonelDTO personelDTO=mapper.toDto(personel);
        return personelDTO;
    }
}

问题是PersonelServiceImpl中的findPersonelByKimlikNo中的人员包括 personelEgitimDurumList是作为图像的PersistentBag 。因此mapStruct不会将实体转换为dto。

随后出现错误日志;

java.lang.StackOverflowError: null
at org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:261) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.kktcmeb.personel.kktcmebpersonel.mapper.PersonelMapperImpl.personelEgitimDurumListToPersonelEgitimDurumDTOList(PersonelMapperImpl.java:159) ~[classes/:na]
at org.kktcmeb.personel.kktcmebpersonel.mapper.PersonelMapperImpl.toDto(PersonelMapperImpl.java:53) ~[classes/:na]
at org.kktcmeb.personel.kktcmebpersonel.mapper.PersonelMapperImpl.personelEgitimDurumToPersonelEgitimDurumDTO(PersonelMapperImpl.java:144) ~[classes/:na]
at org.kktcmeb.personel.kktcmebpersonel.mapper.PersonelMapperImpl.personelEgitimDurumListToPersonelEgitimDurumDTOList(PersonelMapperImpl.java:161) ~[classes/:na]
at org.kktcmeb.personel.kktcmebpersonel.mapper.PersonelMapperImpl.toDto(PersonelMapperImpl.java:53) ~[classes/:na]

有人知道这种情况吗?请帮助

1 个答案:

答案 0 :(得分:0)

@Entity
@Table(name="personel")
**@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")**
        public class Personel extends BaseEntity {

            @OneToOne(cascade = CascadeType.ALL)
            @JoinColumn(name="kisi_id")
            private Kisi kisi;

            @Column(name="personel_tipi",length = 2,nullable = false)
            private int personelTipi;

            @Column(name="sicil_no",length = 100,nullable = false)
            private String sicilNo;

            @OneToMany(fetch = FetchType.EAGER, mappedBy = "personel", cascade =CascadeType.ALL,orphanRemoval = true)
            private List<PersonelEgitimDurum> personelEgitimDurumList= new ArrayList<PersonelEgitimDurum>();

            @Column(name="khk_onay",length = 1)
            private int khkOnay;
        }

添加到实体头-> @ JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property =“ id”)

@Entity
@Table(name = "personel_egitim_durum", indexes = {@Index(name = "index_personel_egitim_durum", columnList = "id")})
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
    public class PersonelEgitimDurum extends BaseEntity {

        @ManyToOne(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
        @JoinColumn(name="personel_id",nullable = false, updatable = true)
        private Personel personel;

        @Column(name = "ogrenim_durumu")
        private String ogrenimDurumu;

        @Column(name = "okul_id", length = 3)
        private Long okulId;

        @Column(name = "universite_bolum_id", length = 4)
        private Long universiteBolumId;

        @Column(name = "mezuniyet_tarihi")
        private Date mezuniyetTarihi;

        @Column(name = "aciklama", length = 500)
        private String aciklama;
    }