Kullanıcı kaydı sisteminde otomatik ID atama mı yapılmalı manuel mi?

Arsen Lüpen

Hectopat
Katılım
28 Şubat 2021
Mesajlar
80
Daha fazla  
Cinsiyet
Erkek
Merhaba. İki tane tablom var. Biri users diğeri de products. Kullanıcı kayıt olurken bir ürün de girerek kayıt oluyor. Şimdi kullanıcı kaydolduğunda bir ID'si olacak. Ve bu ID products tablosunda fk olarak tanımlı. Kullanıcının ürünleri ekleniyor ama fk null geliyor. Yani veritabanında kullanıcı kayıt olduğunda oluşturulan ID'nin otomatik yazılması gerekmez mi? Yoksa ID'yi benim mi girmem lazım. İki işlemi ayrı ayrı mı yapmalıyım? Önce kullanıcıyı kaydedip, kayıt olduktan sonra ürününü kayıt ederken kullanıcının ID'sini de mi eklemiliyim? Örnek verecek olursam.

Kod:
User
- ID.
- Name.
- Products.

Porducts.
-ID
- Name.
- Products_id(fk)

Şeklinde diyelim. Kullanıcı kayıt olurken.
Name: Arsen,
Products: { name: Kalem }
Şeklinde girdiğinde.

Kod:
User.
- ID -> 1
- Name -> arsen.
- Products.

Porducts.
- ID -> 1
- Name -> kalem.
- Products_id(fk) -> null.
 
Son düzenleyen: Moderatör:
Her kullanıcının ID'si benzersiz olmalı o yüzden otomatik.

Benzersiz zaten de sorun kullanıcıya ait olan ürünler tablosunda kullanıcıya ait ürünler geliyor ama fk olan user_id gelmiyor. Null geliyor. Yani otomatik gelmesi lazım dediğiniz gibi ben de öyle biliyorum da emin olmak için sordum.
 
Kullanıcı neden bir product seçiyor? O product mevcut mu yoksa kullanıcı aklına gelen herhangi bir şeyi mesela kumbara, saksı, boncuk vs. diye yazıp yeni kayıt mı oluşturuyor? İki kullanıcı da kalem seçerse ne oluyor. Product tablosunda niye hem id hem de product_id diye bir şey var?
 
Kullanıcı neden bir product seçiyor? O product mevcut mu yoksa kullanıcı aklına gelen herhangi bir şeyi mesela kumbara, saksı, boncuk vs. diye yazıp yeni kayıt mı oluşturuyor? İki kullanıcı da kalem seçerse ne oluyor. Product tablosunda niye hem ID hem de product_id diye bir şey var?

Pardon yazım yanlışı olmuş. Product tablosunda product_id değil user_id olacak. Mesela bir e ticaret sitesi düşünün. Kullanıcı kayıt oluyor, kayıt olurken de isterse bir tane ürün yüklüyor ya da yüklemiyor. Kayıt olurken yüklediği ürünün ürünler tablosuna o kullanıcıya ait olarak kaydolmasını istiyorum. Foreign key çalışıyor. Kullanıcı tablosunda kullanıcı olşturuluyor ve ürünler tablosunda da kullanıcıya ait ürün kayıt ediliyor. Ama ürünün user_id si null geliyor.

Kullanıcı neden bir product seçiyor? O product mevcut mu yoksa kullanıcı aklına gelen herhangi bir şeyi mesela kumbara, saksı, boncuk vs. diye yazıp yeni kayıt mı oluşturuyor? İki kullanıcı da kalem seçerse ne oluyor. Product tablosunda niye hem id hem de product_id diye bir şey var?
Şuan da ben sadece kullanıcıya ait ürün geldiğinde o kullaıcıya ait id nin de gelmesini istiyorum. Sizin sorduğunuzla ilgili henüz bir düşüncem yok.
 
Pardon yazım yanlışı olmuş. Product tablosunda product_id değil user_id olacak. Mesela bir e ticaret sitesi düşünün. Kullanıcı kayıt oluyor, kayıt olurken de isterse bir tane ürün yüklüyor ya da yüklemiyor. Kayıt olurken yüklediği ürünün ürünler tablosuna o kullanıcıya ait olarak kaydolmasını istiyorum. Foreign key çalışıyor. Kullanıcı tablosunda kullanıcı olşturuluyor ve ürünler tablosunda da kullanıcıya ait ürün kayıt ediliyor. Ama ürünün user_id si null geliyor.


Şuan da ben sadece kullanıcıya ait ürün geldiğinde o kullaıcıya ait id nin de gelmesini istiyorum. Sizin sorduğunuzla ilgili henüz bir düşüncem yok.
Siz şu anda çalışan bir koda sahip misiniz, yoksa teoride şöyle mi olur böyle mi olur diye düşünüyorsunuz?
Ve bu ID products tablosunda fk olarak tanımlı. Kullanıcının ürünleri ekleniyor ama fk null geliyor. Yani veritabanında kullanıcı kayıt olduğunda oluşturulan ID'nin otomatik yazılması gerekmez mi?
Senaryoda hangi durumda hangi db sorgularının çalıştığını incelediğinizde, deneme yanılma yöntemi ile kurcaladığınızda bile sorun ortadan kalkacak, istediğiniz şeyleri nasıl yapacağınızı kendiniz fark edeceksiniz.

Gene de olmuyorsa sorguları burada paylaşın yardımcı olalım.
 
Kod:
@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
    private List<Products> products;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public List<Products> getProducts() {
        return products;
    }

    public void setProducts(List<Products> products) {
        this.products = products;
    }
}

Java:
@Entity
public class Products {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @ManyToOne
    @JoinColumn(name="customer_id")
    private Customer customer;
    
    private String productName;
    private String productCode;


    public Long getId() {
        return id;
    }


    public void setId(Long id) {
        this.id = id;
    }


    public Customer getCustomer() {
        return customer;
    }


    public void setCustomer(Customer customer) {
        this.customer = customer;
    }


    public String getProductName() {
        return productName;
    }


    public void setProductName(String productName) {
        this.productName = productName;
    }


    public String getProductCode() {
        return productCode;
    }


    public void setProductCode(String productCode) {
        this.productCode = productCode;
    }
}

Java:
@PostMapping("/addCustomer")
    public Customer addCustomer(@RequestBody Customer customer) {
        return customerRepository.save(customer);
    }
 

Dosya Ekleri

  • Ekran Görüntüsü (2).png
    Ekran Görüntüsü (2).png
    10,9 KB · Görüntüleme: 4
  • Ekran Görüntüsü (3).png
    Ekran Görüntüsü (3).png
    14,4 KB · Görüntüleme: 5
  • Ekran Görüntüsü (4).png
    Ekran Görüntüsü (4).png
    56,5 KB · Görüntüleme: 5
  • Ekran Görüntüsü (5).png
    Ekran Görüntüsü (5).png
    53,8 KB · Görüntüleme: 5
  • Ekran Görüntüsü (6).png
    Ekran Görüntüsü (6).png
    11,1 KB · Görüntüleme: 5

Şurada 6. Controllers başlığı altında görebileceğiniz şekilde, product nesnelerini manuel yaratmayı, sonra product.customer customer.products fieldlarını set etmeyi deneyin.

Sisteminizde relational db kullanacaksanız öncesinde jpa'nın entityleri nasıl kaydettiğini, relationları, persist, merge, load mekanizmalarını vs. kabaca öğrenmeniz iyi olur, mesela Overview of JPA/Hibernate Cascade Types. | Baeldung buradaki gibi aslında arkada neler döndüğünü, komutların dbye nasıl iletildiğini anlamalısınız.
 

Şurada 6. controllers başlığı altında görebileceğiniz şekilde, product nesnelerini manuel yaratmayı, sonra product. Customer customer. Products fieldlarını set etmeyi deneyin.

Sisteminizde relational dB kullanacaksanız öncesinde Jpa'nın entityleri nasıl kaydettiğini, relationları, persist, merge, load mekanizmalarını vs. kabaca öğrenmeniz iyi olur, mesela Overview of JPA/Hibernate Cascade Types. | Baeldung buradaki gibi aslında arkada neler döndüğünü, komutların DB'ye nasıl iletildiğini anlamalısınız.

Dediğiniz gibi yapmayı düşündüm son çare olarak. Ama bana hiç mantıklı gelmedi. Ben foregin key kullanmadan iki ayrı tablo oluşturup verileri alıp kullanıcı verilerini kullanıcıya, ürünleri de ürünler tablosuna kaydetmekten hiçbir farkı kalmıyor o zaman. Yani foreign key kullaniyorsam otomatik olarak tüm verilerin ait olduğu tabloya kaydolmasi lazım. Kaydoluyorda zaten ama foreign key null geliyor. Neyse artık dediğiniz gibi yapacağım. Diğer türlü veri geliyor foreign null geliyor.

Teşekkür ederim yardımınız için. Ben sadece mantığını anlayamadım. Ürünlere gelen bir veriyi niye bir daha ürünlere set etmek zorunda oluyorum. Teşekkür ederim.
 
Yıllardır relational db ile uğraşmadım ben de çok yardımcı olamıyorum, hibernatede custom ayar yapıyorduk, direkt springin repo.save methodu yerine transactionlar, session, persist etme vb. işlemlerini yapıyorduk.

sizin kodda entity configurasyonunu kurcalayarak hangi durumda nasıl davranıyor inceleyin, belki istediğiniz gibi bir çözüm bulursunuz.


şuradakini inceleyin mesela
 

Yeni konular

Geri
Yukarı