2015-12-20 2 views
0

J'ai 3 classes à savoir Satislar, Urunler et MusterilerOneToOne Mapping ne précise pas l'objet mis en correspondance

En classe Satislar, il y a 2 clés étrangères: urunid et musteriid

Chaque objet Satislar a un objet Urunler et un Musteriler objet.

J'ai donc besoin de deux mappages OneToOne différents dans ma classe Satislar. D'abord à Urunler et ensuite à Musteriler.

Lorsque j'ajoute un nouvel objet Satislar à la base de données, j'utilise l'objet existant Musteriler et l'objet Urunler. Le code ne doit pas créer de nouveaux objets Musteriler, Urunler. Pour atteindre que je l'ai utilisé

(insertable= false, updatable=false) 

Mais je ne peux pas définir Urunler et Musteriler objets à un objet Satislar. Il est dit:

La colonne n'autorise pas les valeurs nulles. INSERT échoue.

Je pense que j'ai un problème avec les annotations.

Voici mes blocs de code.

... 
Session session = null;  
Urunler urun = gelenUrunler.get(tblUrunler.getSelectedRow()); 
Musteriler musteri = gelenMusteriler.get(cmbMusteriler.getSelectedIndex()); 
System.out.println(musteri.getId() + "asd " + urun.getId()); 
Satislar satis = new Satislar(); 
satis.setUrun(urun); 
satis.setMusteri(musteri); 
satis.setAdet(Integer.valueOf(txtAdet.getText().trim())); 
satis.setTarih(new Date()); 

try { 

    session = HibernateUtil.getSessionFactory().openSession(); 
    session.beginTransaction(); 

    session.save(satis);  
    session.getTransaction().commit(); 

} catch (Exception e) { 
    System.out.println("Satış sırasında hata oluştu." + e); 
} finally { 
    session.close();   
} 
... 

classe Satislar:

... 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "id") 
private Integer id; 
@Basic(optional = false) 
@Column(name = "urunid", insertable = false, updatable = false) 
private Integer urunid; 
@Basic(optional = false) 
@Column(name = "adet") 
private Integer adet; 
@Basic(optional = false) 
@Column(name = "musteriid", insertable = false, updatable = false) 
private Integer musteriid; 
@Basic(optional = false) 
@Column(name = "tarih") 
@Temporal(TemporalType.TIMESTAMP) 
private Date tarih; 




@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(name = "urunid", insertable = false, updatable = false) 
private Urunler urun; 

public Urunler getUrun() { 
    return urun; 
} 

public void setUrun(Urunler urun) { 
    this.urun = urun; 
} 

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(name = "musteriid", insertable = false, updatable = false) 
private Musteriler musteri; 

public Musteriler getMusteri() { 
    return musteri; 
} 

public void setMusteri(Musteriler musteri) { 
    this.musteri = musteri; 
} 
... 

Répondre

1

Vous avez fait tout insérables et non actualisable. Donc, Hibernate n'insère rien dans les colonnes quand il insère le Satislar. Supprimer les champs urunid et musteriid: ils sont inutiles. Vous avez déjà une association OneToOne, ce qui est suffisant.

Ensuite, supprimez les attributs insertable et updatable des deux annotations JoinColumn. De plus, si plusieurs Satislar se réfèrent au même Urunler ou Musteriler, ce que vous avez en réalité est une association ManyToOne, et non une OneToOne. Enfin, cascade = CascadeType.ALL est très douteux: si un Urunler peut exister sans Satislar, alors vous ne voulez probablement pas créer/supprimer un Urunler lors de la création/suppression d'un Satislar.

+0

J'ai fait des erreurs simples à cause de ceci est mon premier projet avec Hibernate. Votre réponse l'a résolu. Merci. La raison pour laquelle urunid et musteriid est là, j'ai complètement oublié de les supprimer. Et je pensais insérable et modifiable est utilisé pour empêcher l'autre table de changer. Je pense que les options en cascade font cela. J'ai changé OneToOne en ManyTo One. C'était ma plus grosse erreur. –

1

Lorsque vous spécifiez @JoinColumn(name = "column_id") pour la relation, Hibernate trouvera column_id comme colonne de clé étrangère pour la relation. Vous devez simplement ajouter les entités et les enregistrer.

Satislar s = new Satislar(); 

Urunler u = new Urunler(); 

Musteriler m = new Musteriler(); 

s.setUrun(u); 
s.setMusteri(m); 

session.save(s); 

Vous devez supprimer les champs urunid et musteriid de Satislar et spécifiez les noms de colonnes que vous voulez pour ces colonnes dans l'annotation JoinColumn.

@Entity 
public class Satislar { 
    .... 

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name = "urun_id") 
    private Urunler urun; 

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name = "musteri_id") 
    private Musteriler musteri; 
    .... 
} 

Espérons que cela aide.