我在网页上有一个表单,需要将其放入两个不同的表中,即appinfo和preferences。appinfo和首选项均具有自动生成的ID。appinfo还包含一个外键,称为“ preferenceid”。我需要使用休眠模式将自动生成的首选项表ID输入此字段。
我已经使用SpringMVC创建了两个POJO,并试图将它们写入数据库。基本格式为:
Preferences.java:
@Entity
@Table (name ="preferences")
public class Preferences implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int preferencesid;
(Other variables with getters and setters)
@OneToOne
@JoinColumn(name="preferencesid", referencedColumnName="preferenceid")
private AppInfo ai;
public AppInfo getAi() {
return ai;
}
public void setAi(AppInfo ai) {
this.ai = ai;
}
AppInfo.java
@Entity
@Table (name ="appinfo")
public class AppInfo implements Serializable {
@Id
@Column(name = "appuserid")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@OneToOne
@JoinColumn(name="preferenceid", referencedColumnName="preferencesid")
private Preferences p;
(Other variables and getters and setters)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Preferences getP() {
return p;
}
public void setP(Preferences p) {
this.p = p;
}
当我保留数据时,“首选项”工作正常,它会自动生成其id值。但是我的AppInfo没有正确获取preferencesid。它只有null。如果我更改表以允许为空,则两者都将插入所有正确的信息,但AppInfo表中的preferencesid现在为空。
选项1
如果您要AppInfo
保留外键,Preferences
而Preferences
无需使用外键AppInfo
,则进行如下更改。
从首选项中删除映射
@Entity
@Table (name ="preferences")
public class Preferences implements Serializable {
// @OneToOne(mappedBy)
// @JoinColumn(name="preferencesid", referencedColumnName="preferenceid")
// private AppInfo ai;
并在中指定级联类型 AppInfo
@Entity
@Table (name ="appinfo")
public class AppInfo implements Serializable {
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name="preferenceid", referencedColumnName="preferencesid")
private Preferences p;
如果要创建它,cascade = CascadeType.ALL
则需要按以下方式保存实例。
AppInfo ai = new AppInfo();
Preferences p = new Preferences();
ai.setP(p);
session.persist(ai);
如果设置为cascade = CascadeType.ALL
,则可以使用session.save(ai);
。
选项2
如果您希望两个表之间都保持外键,则进行如下更改。
@Entity
@Table (name ="appinfo")
public class AppInfo implements Serializable {
....
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name="preferenceid")
private Preferences p;
@Entity
@Table (name ="preferences")
public class Preferences implements Serializable {
....
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name="appuserid")
private AppInfo ai;
CascadeType.All
如果需要,将级联类型更改为。保存实例时,
AppInfo ai = new AppInfo();
Preferences p = new Preferences();
ai.setP(p);
p.setAi(ai);
session.persist(ai);
希望这可以帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句