OneToOne Mapping 不设置映射对象
OneToOne Mapping does not set mapped object
我有 3 个 class,即 Satislar
、Urunler
和 Musteriler
在 Satislar class 中,有 2 个外键:urunid
和 musteriid
每个Satislar
对象有一个Urunler
对象和一个Musteriler
对象。
所以我的 Satislar
class 中需要两个不同的 OneToOne 映射。首先是 Urunler
,其次是 Musteriler
。
当我向数据库添加新的 Satislar 对象时,我将使用现有的 Musteriler
对象和 Urunler
对象。代码不得创建新的 Musteriler
、Urunler
对象。
为此,我使用了
(insertable= false, updatable=false)
但我无法将 Urunler
和 Musteriler
对象设置为 Satislar
对象。它说:
column does not allow nulls. INSERT fails.
我觉得我的注释有问题。
这是我的代码块。
...
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();
}
...
Satislar class:
...
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 时不会在列中插入任何内容。
删除 urunid
和 musteriid
字段:它们没用。您已经有一个 OneToOne 关联,这就足够了。
然后把insertable
和updatable
这两个注解的属性去掉。
此外,如果多个 Satislar 引用同一个 Urunler 或 Musteriler,您实际拥有的是 ManyToOne 关联,而不是 OneToOne。
最后,cascade = CascadeType.ALL
非常可疑:如果 Urunler 可以在没有 Satislar 的情况下存在,那么当 creating/removing Satislar 时,您可能不想 create/remove Urunler。
当您为关系指定 @JoinColumn(name = "column_id")
时,hibernate 将计算出 column_id
作为关系的外键列。您只需将实体加在一起并保存即可。
Satislar s = new Satislar();
Urunler u = new Urunler();
Musteriler m = new Musteriler();
s.setUrun(u);
s.setMusteri(m);
session.save(s);
您应该从 Satislar
中删除 urunid
和 musteriid
字段,并根据需要在 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;
....
}
希望对您有所帮助。
我有 3 个 class,即 Satislar
、Urunler
和 Musteriler
在 Satislar class 中,有 2 个外键:urunid
和 musteriid
每个Satislar
对象有一个Urunler
对象和一个Musteriler
对象。
所以我的 Satislar
class 中需要两个不同的 OneToOne 映射。首先是 Urunler
,其次是 Musteriler
。
当我向数据库添加新的 Satislar 对象时,我将使用现有的 Musteriler
对象和 Urunler
对象。代码不得创建新的 Musteriler
、Urunler
对象。
为此,我使用了
(insertable= false, updatable=false)
但我无法将 Urunler
和 Musteriler
对象设置为 Satislar
对象。它说:
column does not allow nulls. INSERT fails.
我觉得我的注释有问题。
这是我的代码块。
...
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();
}
...
Satislar class:
...
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 时不会在列中插入任何内容。
删除 urunid
和 musteriid
字段:它们没用。您已经有一个 OneToOne 关联,这就足够了。
然后把insertable
和updatable
这两个注解的属性去掉。
此外,如果多个 Satislar 引用同一个 Urunler 或 Musteriler,您实际拥有的是 ManyToOne 关联,而不是 OneToOne。
最后,cascade = CascadeType.ALL
非常可疑:如果 Urunler 可以在没有 Satislar 的情况下存在,那么当 creating/removing Satislar 时,您可能不想 create/remove Urunler。
当您为关系指定 @JoinColumn(name = "column_id")
时,hibernate 将计算出 column_id
作为关系的外键列。您只需将实体加在一起并保存即可。
Satislar s = new Satislar();
Urunler u = new Urunler();
Musteriler m = new Musteriler();
s.setUrun(u);
s.setMusteri(m);
session.save(s);
您应该从 Satislar
中删除 urunid
和 musteriid
字段,并根据需要在 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;
....
}
希望对您有所帮助。