Temel veritabanı işlemleri (CRUD) için Varlık Sınıflarına (Entity Classes) bağımlı olarak geliştirme ortamı tarafından otomatik oluşturulan JPA Kontrol Sınınfları (JPAController), veritabanı üzerinde tanımlı, tamsayı türünde ID sütunu bulunmayan tablolar için Varlık Sınıfı oluşturulmasına rağmen bu Kontrol Sınıfları üretiliyor ama temel fonksiyonları ile oluşturulamıyor.

Acaba bu durum platform ile ilgili bir sorun mudur? Yoksa böyle tablolar veya Varlık Sınıfları için olası bir durum mudur?

Bu durumla ilk kez karşılaştığımda sorunun sadece String türlerinin varlığından kaynaklandığını düşünüyordum. NetBeans platformu üzerinde bir varlık sınıfı için kontrol sınıfı üretme aracı aracı ile ID sütunu bulunan bir tablonun Varlık Sınıfı için otomatik olarak üretilen ve temel fonksiyonları ile oluşturulan Kontrol Sınıfının içeriği: alt text

INT veya benzer türde ID sütunu bulunmayan ancak VARCHAR türünde primary key'e sahip bir tablodan bir Varlık Sınıfı için Kontrol Sınıfı oluşturulması istediğimizde:

alt text

hatası ile karşılaşıyoruz ve oluşturulan Kontrol Sınıfının içeriği boş oluyor: alt text

Users.java Varlık Sınıfı:

@Entity
@Table(name = "USERS")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
    @NamedQuery(name = "Users.findByIdnumber", query = "SELECT u FROM Users u WHERE u.idnumber = :idnumber"),
    @NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password")})
public class Users implements Serializable 
{
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "users")
    private Collection<AccountingStatusInfo> accountingStatusInfoCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "users")
    private Collection<CurrentInfo> currentInfoCollection;
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 11)
    @Column(name = "idnumber")
    private String idnumber;
    @Size(max = 45)
    @Column(name = "password")
    private String password;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "users")
    private Collection<GeneralInfo> generalInfoCollection;

    public Users() {
    }

    public Users(String idnumber) {
        this.idnumber = idnumber;
    }

    public String getIdnumber() {
        return idnumber;
    }

    public void setIdnumber(String idnumber) {
        this.idnumber = idnumber;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @XmlTransient
    public Collection<GeneralInfo> getGeneralInfoCollection() {
        return generalInfoCollection;
    }

    public void setGeneralInfoCollection(Collection<GeneralInfo> generalInfoCollection) {
        this.generalInfoCollection = generalInfoCollection;
    }

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

    @Override
    public String toString() {
        return "xxxx.xxxx.jpa.entity.Users[ idnumber=" + idnumber + " ]";
    }

    @XmlTransient
    public Collection<CurrentInfo> getCurrentInfoCollection() {
        return currentInfoCollection;
    }

    public void setCurrentInfoCollection(Collection<CurrentInfo> currentInfoCollection) {
        this.currentInfoCollection = currentInfoCollection;
    }

    @XmlTransient
    public Collection<AccountingStatusInfo> getAccountingStatusInfoCollection() {
        return accountingStatusInfoCollection;
    }

    public void setAccountingStatusInfoCollection(Collection<AccountingStatusInfo> accountingStatusInfoCollection) {
        this.accountingStatusInfoCollection = accountingStatusInfoCollection;
    }

}

Platform: NetBeans 7.4 , (OS: ubuntu)

Database: MySql

JDK rel.: openJDK

Bug raporu: 242442

soruldu: 27 Şub '14, 04:28

cagcak's gravatar image

cagcak
16271320
cevap kabul oranı: 25%

değiştirildi: 01 Haz '14, 02:11

@cagcak Eger veritabani tablolarinda id alani (auto increment) veya primary key alani(herhangi unique olan bir alan auto increment olmak zorunda degil!) yoksa veritabani tasariminiz yanlis demektir!

(27 Şub '14, 06:53) CemIkta ♦ CemIkta's gravatar image

@CemIkta Bahsi geçen UsersJpaController() sınıfının Users() varlık sınıfından oluşturamadığı tablo tasarımı:

alt text

(27 Şub '14, 07:10) cagcak cagcak's gravatar image
1

@cagcak eger Controller'de generic metodlar yaziyorsan id'leri heryerde Long ve Auto Increment kullanman isleri kolaylastirir. User tablosunda id long auto increment, user_name, password, first_name, last_name string gibi kullanirsan sorun cozulur. Veritabani Tablosunu degisteremiyorsan, asagidaki gibi kullan. Bu durumda id ile yapilan metodlarina String id, Long ile olanlara Long id parametreleri ile metodlar yazmalisin.

   
@Id @Basic(optional = false) @Column(name = "idnumber", nullable = false, length = 11) private String idNumber;

(27 Şub '14, 07:34) CemIkta ♦ CemIkta's gravatar image

idnumber alanında 009212x23 gibi değerler aldığımızdan ötürü INT türünde gerçekleştiremiyorum. Halihazırda Users.java varlık sınıfında bu alan şu şekilde tanımlı bulunuyor:

@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 11)
@Column(name = "idnumber")
private String idnumber;
(27 Şub '14, 08:02) cagcak cagcak's gravatar image

locale yanlislikla kopyalanmis duzelttim.

(27 Şub '14, 08:04) CemIkta ♦ CemIkta's gravatar image
1

öncelikle sorunun soruluş tarzı müthiş. Bu örnek soru olarak baş köşeye konulmalı. İkincil olarak ben bunun bir bug olduğunu düşünüyorum. Platform'a (zannediyorum NetBeans) bir issue açmanız herkesin faydasına olacaktır.

(28 Şub '14, 02:02) molgun molgun's gravatar image
1

@molgun Öneriniz için teşekkür ederim. Hata raporu, NetBeans topluluğuna Bug 242442 adı altında iletilmiştir. Gelişmelerden haberdar edeceğim inşaallah.

(28 Şub '14, 05:06) cagcak cagcak's gravatar image
7 yorumdan 5 tanesi gösteriliyor hepsini göster

asagidaki sayfanin en altindaki cozumu dener misin

http://hilaltarakci.blogspot.com.tr/2009/06/sample-web-based-application.html

permanent link

cevaplandı: 27 Şub '14, 06:09

MCY's gravatar image

MCY
1.1k2622
cevap kabul oranı: 16%

değiştirildi: 27 Şub '14, 06:14

Hilal Tarakçı beyin çözümü: ...move the jpa annotations from variable declarations to accessor methods... maalesef sonuç vermemişti. Zaten extraproximity isimli kullanıcı: after moving jpa annotations from variable declarations to accessor methods it does not run on web server until reversing the process by moving them to their old places.. yanıtıyla bunu ifade ediyor.

(27 Şub '14, 06:52) cagcak cagcak's gravatar image
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:

×1,079
×86
×66
×39
×3

Soruldu: 27 Şub '14, 04:28

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

Son güncelleme: 01 Haz '14, 02:11

powered by BitNami OSQA