mastah-mastah sekalian
ane punya problem nih masalah spring dengan lazy collection
jadi ane punya tabel yang berelasi, hasil generate netbeans
tabel itu adalah tabel kabupaten,kecamatan,desa (saling berelasi)
Spoiler for kecamatan:
Code:
@Entity
@Table(name = "kecamatan")
public class Kecamatan implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@NotNull
@Column(name = "kode_kec")
private int kodeKec;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 64)
@Column(name = "nama")
private String nama;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "kodeKec")
private Collection<Desa> desaCollection;
@JoinColumn(name = "kode_kota", referencedColumnName = "kode_kota")
@ManyToOne(optional = false)
private Kabupaten kodeKota;
public Kecamatan() {
}
public Kecamatan(Integer id) {
this.id = id;
}
public Kecamatan(Integer id, int kodeKec, String nama) {
this.id = id;
this.kodeKec = kodeKec;
this.nama = nama;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public int getKodeKec() {
return kodeKec;
}
public void setKodeKec(int kodeKec) {
this.kodeKec = kodeKec;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
@XmlTransient
public Collection<Desa> getDesaCollection() {
return desaCollection;
}
public void setDesaCollection(Collection<Desa> desaCollection) {
this.desaCollection = desaCollection;
}
public Kabupaten getKodeKota() {
return kodeKota;
}
public void setKodeKota(Kabupaten kodeKota) {
this.kodeKota = kodeKota;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Kecamatan)) {
return false;
}
Kecamatan other = (Kecamatan) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.example.entity.Kecamatan[ id=" + id + " ]";
}
}
Spoiler for kabupaten:
Code:
@Entity
@Table(name = "kabupaten")
public class Kabupaten implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@NotNull
@Column(name = "kode_kota")
private int kodeKota;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 64)
@Column(name = "nama")
private String nama;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "kodeKota",fetch= FetchType.LAZY)
@LazyCollection(LazyCollectionOption.EXTRA)
private Collection<Kecamatan> kecamatanCollection;
public Kabupaten() {
}
public Kabupaten(Integer id) {
this.id = id;
}
public Kabupaten(Integer id, int kodeKota, String nama) {
this.id = id;
this.kodeKota = kodeKota;
this.nama = nama;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public int getKodeKota() {
return kodeKota;
}
public void setKodeKota(int kodeKota) {
this.kodeKota = kodeKota;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
@XmlTransient
public Collection<Kecamatan> getKecamatanCollection() {
return kecamatanCollection;
}
public void setKecamatanCollection(Collection<Kecamatan> kecamatanCollection) {
this.kecamatanCollection = kecamatanCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Kabupaten)) {
return false;
}
Kabupaten other = (Kabupaten) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.example.entity.Kabupaten[ id=" + id + " ]";
}
}
Code:
public class KabupatenDaoImpl extends HibernateDaoSupport implements KabupatenDao {
@Autowired
public void init(SessionFactory sessionFactory) {
setSessionFactory(sessionFactory);
}
@Override
public List<Kabupaten> getAll(int startPage, int pageSize) {
DetachedCriteria criteria = DetachedCriteria.forClass(Kabupaten.class);
return getHibernateTemplate().findByCriteria(criteria, startPage * pageSize, pageSize);
}
...
}
nah sewaktu mau nampilin pakai Gson
Code:
List<Kabupaten> kab = kabupatenDao.getAll(0,15);
Gson gson = new Gson();
String res = gson.toJson(kab);
selalu muncul eksepsi
failed to lazily initialize a collection of role: com.example.entity.Kabupaten.kecamatanCollection, no session or session was closed
ane udah ganti nambahin session di controller, nambahin @transactional di DAO nya, nambah tx:annotation-driven tapi ga ngaruh. kira kira gimana ya solusinya. Trims