ورود

View Full Version : سوال: لود نکردن داده های جدول فرزند



Restlesa
سه شنبه 15 فروردین 1396, 23:33 عصر
سلام بر همگی
دو تا جدول با نام های Site و IP دارم که رابطه بین اون ها OneToMany هستش که سورس دو تا کلاس رو در ادامه ضمیمه کردم

کلاس Site
@Entity
@Table(name = "tbl_site", uniqueConstraints = { @UniqueConstraint(columnNames = "name", name = "name_un"), @UniqueConstraint(columnNames = "octed2", name = "octed2_un") })
public class Site implements Serializable {

private static final Long serialVersionUID = 3L;

private Long site_id;

private String name;
private String octed2;

private List<IP> ip;

public Site() {}

public Site(String name, String octed2) {
this.name = name;
this.octed2 = octed2;
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "site_id", nullable = false, unique = true, columnDefinition = "INT unsigned")
public Long getSite_id() {
return site_id;
}

public void setSite_id(Long site_id) {
this.site_id = site_id;
}

@Column(name = "name", nullable = false, length = 30)
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Column(name = "octed2", nullable = false, length = 3)
public String getOcted2() {
return octed2;
}

public void setOcted2(String octed2) {
this.octed2 = octed2;
}

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "site")
@Fetch(value = FetchMode.SUBSELECT)
public List<IP> getIp() {
return ip;
}

public void setIp(List<IP> ip) {
this.ip = ip;
}
}


کلاس IP
@Entity
@Table(name = "tbl_ips", uniqueConstraints = { @UniqueConstraint(columnNames = "ip_address", name = "ip_address_un")})
public class IP implements Serializable {

private static final Long serialVersionUID = 3L;

private Long ipId;

private String IPAddress;

private Site site;

public IP() {}

public IP(String IPAddress) {
this.IPAddress = IPAddress;
}

public IP(String IPAddress, Site site) {
this.IPAddress = IPAddress;
this.site = site;
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ip_id", nullable = false, unique = true, columnDefinition = "INT unsigned")
public Long getIpId() {
return ipId;
}

public void setIpId(Long ipId) {
this.ipId = ipId;
}

@Column(name = "ip_address", nullable = false, length = 15)
public String getIPAddress() {
return IPAddress;
}

public void setIPAddress(String IPAddress) {
this.IPAddress = IPAddress;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "site_id")
public Site getSite() {
return site;
}

public void setSite(Site site) {
this.site = site;
}
}

در جایی از پروژه ام نیاز دارم که فقط تمامی داده های جدول Site رو بخونم برای این کار از دستور زیر استفاده کردم:
@Override
public List getAllSite() {
return sessionFactory.getCurrentSession().createQuery("from Site order by site_id desc").getResultList();
}

حالا مشکل کار اینجاس که با استفاده از دستور بالا و با توجه به اینکه از دستور fetch = FetchType.LAZY هم در ایجاد رابطه بین دو جدول استفاده کردم تمامی اطلاعات دو جدول خونده میشه
برای اینکه فقط اطلاعات جدول Site خونده بشه کار دیگه ای هم باید انجام بدم ؟؟؟

Restlesa
جمعه 18 فروردین 1396, 10:56 صبح
از مدیران بخش خواهش می کنم راهنماییم کنن :گریه::گریه::گریه:

vahid-p
جمعه 18 فروردین 1396, 14:26 عصر
متاسفانه بخش جاوا خیلی کم رونق شده و مدیران نیستند.
منم Hibernate رو زیاد کار نکردم، ولی طبق تعریف FetchType.LAZY باید اونطوری باشه که شما میگید.
به نظرم آموزش های اینترنت رو سرچ کنید، شاید یه جای کار اشتباه کردید.
getAllSite چی رو override میکنه؟ برای این متد لازم نیست annotation ها رو اضافه کنید؟ مگر اینکه به صورت داخلی از getSite استفاده کنه که بعید میدونم!

این لینک رو یه نگاه بنداز:
https://vladmihalcea.com/2013/10/17/hibernate-facts-the-importance-of-fetch-strategy/

Restlesa
شنبه 19 فروردین 1396, 22:14 عصر
متاسفانه بخش جاوا خیلی کم رونق شده و مدیران نیستند.
متاسفانه همین طوره که میگی


getAllSite چی رو override میکنه؟ برای این متد لازم نیست annotation ها رو اضافه کنید؟ مگر اینکه به صورت داخلی از getSite استفاده کنه که بعید میدونم!
یه کلاس interface Site دارم و این متد متد پیاده سازی شده کلاس interface Site هستش و کارش اینه که تمامی رکورد های ذخیره شده در جدو.ل Site رو بر می گردونه + تمامی رابطه هایی که با جدول های دیگه داره که نمی خوام داده های جدول های دیگه برام واکشی بشه

تو اینترنت هم خیلی سرچ زدم و دقیقا از نمونه هایی که پیدا کردم استفاده کردم اما نمی دونم چرا باز داده های اضافه واکشی میشن :ناراحت:

vahid-p
یک شنبه 20 فروردین 1396, 21:34 عصر
متد getSite هم اضافی بر میگردونه؟ (تو کلاس IP)

جواب اینکه آیا getAllSite نیازی به annotation هایی که برای getSite گذاشتید نداره؟ نوع Fetch رو مشخص نکردید.
البته مقدار پیشفرض داره که تو لینکی که دادم گفته:

By default, the JPA @ManyToOne and @OneToOne annotations are fetched EAGERly, while the @OneToMany and @ManyToMany relationships are considered LAZY


دو مورد دیگه رو هم چک کن.
تو یه سورس کد نوشته بود //start new session to check fetch type . شما هم اگر قبلش از یه متد دیگه استفاده کردی، session رو close و بعد یکی دیگه درست کن.
مورد بعد اینکه در اکثر مثال هایی که دیدم همراه با مشخص کردن FetchType از CascadeType هم استفاده کردن. CascadeType.All

این لینک رو ببین: ​http://www.concretepage.com/hibernate/fetch_hibernate_annotation