İki modelim var;

Holding:

@Entity
@AccessType("field")
@Table(uniqueConstraints = {@UniqueConstraint(columnNames={"HoldingName"})})
public class Holding extends BaseClass {

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     @JoinTable(name = "Holding_Rel_Company", joinColumns =
     { @JoinColumn(name = "HoldingID") }, inverseJoinColumns = @JoinColumn(name = "CompanyID"))
     private List<Company> companies;

    @Id
    @Column(name="HoldingID", length=36)
    private String holdingId;

    @Column(name="HoldingName", length=25)
    @IndexColumn(name = "IdxHoldingName")
    private String holdingName;

    @Column(name="Description", length=210)
    private String description;
<getter/setter>

Company:

@Entity
@AccessType("field")
@Table(uniqueConstraints = {@UniqueConstraint(columnNames={"CompanyName"})})
//@org.hibernate.annotations.Table(indexes = { @Index(name="index1", columnNames={"column1", "column2"} ) })
public class Company extends BaseClass {

    @Id
    @Column(name="CompanyID", length=36)
    private String companyId;

    transient private String holdingId;
    //transient private String holdingName;

    @Column(name="CompanyName", length=25)
    @IndexColumn(name = "IdxCompanyName")
    private String name;

    @Column(name="Description", length=210)
    private String description;
    <getter/setter>

Datatable üzerinde Holding Adı- Şirket Adı - Şirketin açıklamasını göstermek istiyorum.

ASP.NET MVC'de almak istediğim bilgiye göre yeni bir class oluşturup:

Public Class ......
{
string HoldingName {get;set;}
string CompanyName {get;set;}
string Desc {get;set;}
}

bunun içerisine bilgiyi çekip datatable'a gönderirdik. Hibernate'tede bunu aynı yöntemlemi yapıyoruz yoksa konu hibernate olunca işler değişiyor mu?

soruldu: 23 Haz '12, 03:01

SaRPaRDa's gravatar image

SaRPaRDa
5.0k213165
cevap kabul oranı: 27%

değiştirildi: 23 Haz '12, 05:09

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183


@trueLife arkadasin sorgulama sekli ile yapabilirsiniz, fakat jsf datatable icinde birden fazla entity modeli birlikte kullanacaksaniz bir tane DTO(data transfer objects) yazmaniz islerinizi cok kolaylastirir.(ozellikle CRUD islerinde)

Entity classlarinizda bazi yanlislar var. Eger mecbur degilseniz @Id alanlarinizi String kullanmaniz tavsiye edilmez. Ayrica transient private String holdingId; kismini transient degil foreign key kullanmalisiniz. Tam table yapinizi bilemiyorum ama yaklasik soyle olmali 2 entity modelleriniz:(Netbeans icinde Entity clasess from database tables'i secerek veya eclipse icinde jpa tool/hibernate tool kullanarak db table'lariniz otomatik entity classlara cevirebilirsiniz, ben asagidakileri Netbeans ile olusturdum.)

package entity;

import java.io.Serializable; import java.util.List; import javax.persistence.*;

/ * @author cem ikta / @Entity @Table(name = "holding", uniqueConstraints = { @UniqueConstraint(columnNames = {"name"})}) public class Holding implements Serializable { private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "holding_id", nullable = false)
private Integer holdingId;

@Basic(optional = false)
@Column(name = "name", nullable = false, length = 100)
private String name;

@Column(name = "description", length = 100)
private String description;

@OneToMany(mappedBy = "holdingId", fetch = FetchType.LAZY)
private List<Company> companyList;

public Holding() {
}

public Holding(Integer holdingId) {
    this.holdingId = holdingId;
}

public Holding(Integer holdingId, String name) {
    this.holdingId = holdingId;
    this.name = name;
}

public Integer getHoldingId() {
    return holdingId;
}

public void setHoldingId(Integer holdingId) {
    this.holdingId = holdingId;
}

public String getName() {
    return name;
}

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

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public List<Company> getCompanyList() {
    return companyList;
}

public void setCompanyList(List<Company> companyList) {
    this.companyList = companyList;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (holdingId != null ? holdingId.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 Holding)) {
        return false;
    }
    Holding other = (Holding) object;
    if ((this.holdingId == null && other.holdingId != null) || (this.holdingId != null && !this.holdingId.equals(other.holdingId))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return this.name;
}

}

package entity;

import java.io.Serializable; import javax.persistence.*;

/ * @author devsniper / @Entity @Table(name = "company", uniqueConstraints = { @UniqueConstraint(columnNames = {"name"})}) public class Company implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "company_id", nullable = false)
private Integer companyId;

@Basic(optional = false)
@Column(name = "name", nullable = false, length = 100)
private String name;

@Column(name = "description", length = 100)
private String description;

@JoinColumn(name = "holding_id", referencedColumnName = "holding_id")
@ManyToOne(fetch = FetchType.LAZY)
private Holding holdingId;

public Company() {
}

public Integer getCompanyId() {
    return companyId;
}

public void setCompanyId(Integer companyId) {
    this.companyId = companyId;
}

public String getName() {
    return name;
}

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

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public Holding getHoldingId() {
    return holdingId;
}

public void setHoldingId(Holding holdingId) {
    this.holdingId = holdingId;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (companyId != null ? companyId.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 Company)) {
        return false;
    }
    Company other = (Company) object;
    if ((this.companyId == null && other.companyId != null) || (this.companyId != null && !this.companyId.equals(other.companyId))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return this.name;
}

}

Managed bean icinde de soyle degisik sorgular yapabilirsiniz lazy loading ile:

// em = EntityManager

   Query query = em.createQuery("select c from Holding c");
   List<Holding> holdingList = query.getResultList();

    for (Holding holding : holdingList) {
        System.out.println(holding.getName());
        for (Company company : holding.getCompanyList()) {
            System.out.println(company.getName());
        }
    }
permanent link

cevaplandı: 23 Haz '12, 22:16

CemIkta's gravatar image

CemIkta ♦
19.9k29125190
cevap kabul oranı: 36%

Öncelikle bu kadar detaylı cevap için teşekkür etmeliyim.

ID'leri string vermemin sebebi, MS-SQL'de guidleri kullanabilmek içindi. UUID ile yeni bir guid oluşturup kaydediyorum. Guidler için farklı bir tip tanımı var mı?

Entity'ler üzerinden Database oluşturduğum için söylediğiniz toolları kullanamıyorum. UML'ler üzerinden Entity'leri oluşturan toollar varmış ama hem tam istediğimi yapabildiğim bir tool bulamadım hemde öğrenme aşamasında biraz emek harcamak istedim.

DTO'ları biraz araştırdım sabah, DAO'dan bilgileri çekiyor ve tanımladığım field düzeninde geriye List dönderiyor?

(25 Haz '12, 06:36) SaRPaRDa SaRPaRDa's gravatar image

Tabloları birbirlerine bağlamak için HOLDING_REL_COMPANY adinda bir tablo kullanıyorum. Bu yöntemde Company içerisinde tanımladığım holdingID'yi tabloya kaydetmiyorum. Bu sebepten transient tanımlamıştım. UI'den gelen holdingId bilgisini alabilmek için kullanıyordum. Yanlış mantık mı acaba?

(25 Haz '12, 06:47) SaRPaRDa SaRPaRDa's gravatar image

Eger tek bir db table'dan liste cekecekseniz List<company> seklinde DTO olmadan direk entity kullanmak en kolayidir. Ama Holding ve Company bilgilerini tek bir yerde degistirecekseniz bir DTO(aslinda pojo class getter setter ile) yazip List<holdingcompanydto> seklinde database den hem holding hemde company tablar'lari ile iliskili data cekersiniz. String ID'ler gerekli ise kullanilabilir. UUID'nin baska karsiligi var mi bilemiyorum.

(25 Haz '12, 07:51) CemIkta ♦ CemIkta's gravatar image

Sizin tablo yapinizdan anladigim Holding tablosu @OneToMany 1:n seklinde, company tablosu ise @ManyToOne n:1 seklinde. Eger boyle ise 2 tablo ile iliskilendirmek daha kolay. Eger 3. iliski tablosu (HOLDING_REL_COMPANY tablosu demissiniz) kullaniyorsaniz bu @ManyToMany m:n seklinde oluyor. O zaman 3 entity tanimlamaniz gerekir. Detayli bilgiler icin http://www.btsoru.com/questions/1035/jpa-konulu-bir-dokuman-tavsiye-edebilir-misiniz bu linkteki kaynaklardan ilgili JPA annotation'lara bakmanizi tavsiye ederim.

(25 Haz '12, 08:20) CemIkta ♦ CemIkta's gravatar image

Bilgiler için tekrar teşekkür ederim.

(25 Haz '12, 08:37) SaRPaRDa SaRPaRDa's gravatar image

eger sorunuzu yalnış anlamadıysam yapmak istediğiniz yukardaki entity class ları üzerinden kaydedilen şirket ve holding bilgilerini bir table da göstermek istiyorsunuz bunun için bir metod yazıp içersinde sole bişi yazılabilir entitiyManager instance ını olusturup

Query query = entityManager.createNativeQuery("select h.name  , s.name ,s.acıklama  from holding h, şirket  s"); 
List<object[]> Mylist = query.getResultList();

ardından defaultTableMOdel isnatnce ına tablo başlıkları ve Mylist i verirseninz olucaktır

permanent link

cevaplandı: 23 Haz '12, 16:09

trueLife's gravatar image

trueLife
699182430
cevap kabul oranı: 10%

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×109
×2

Soruldu: 23 Haz '12, 03:01

Görüntüleme: 1,141 kez

Son güncelleme: 25 Haz '12, 08:37

powered by BitNami OSQA