我在网页上有一个表单,需要放在两个不同的表中,appinfo和preferences。appinfo和preferences都有一个自动生成的id。appinfo还包含一个外键到preferences调用“preferenceid”。我需要使用hibernate在这个字段中输入preferences表的自动生成id。
我用SpringMVC创建了两个POJO,并试图将它们写入数据库。基本格式为:
首选项.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);
希望这有帮助。