我有3个类别,分别是SatislarUrunlerMusteriler

在Satislar类中,有2个外键:urunidmusteriid

每个Satislar对象都有一个Urunler对象和一个Musteriler对象。

因此,在我的Satislar类中需要两个不同的OneToOne映射。首先是Urunler,第二是Musteriler

当我向数据库添加一个新的Satislar对象时,将使用现有的Musteriler对象和Urunler对象。代码不得创建新的MusterilerUrunler对象。
为了实现我已经使用的

(insertable= false, updatable=false)


但是我不能将UrunlerMusteriler对象设置为Satislar对象。它说 :


  列不允许为空。插入失败。


我认为注释存在问题。

这是我的代码块。

...
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();
}
...


讽刺类:

...
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;
}
...

最佳答案

您已使一切变得不可插入且不可更新。因此,Hibernate在插入Satislar时不会在列中插入任何内容。

删除urunidmusteriid字段:它们没有用。您已经有一个OneToOne关联,这就足够了。

然后从两个insertable批注中删除updatableJoinColumn属性。

另外,如果多个Satislar引用同一个Urunler或Musteriler,则您实际拥有的是ManyToOne关联,而不是OneToOne。

最后,cascade = CascadeType.ALL是非常可疑的:如果Urunler可以在没有Satislar的情况下存在,那么您可能不希望在创建/删除Satislar时创建/删除Urunler。

10-01 05:12