我在一个网页上有一个表单,需要放在两个不同的表中,appinfo和首选项。appinfo和首选项都有一个自动生成的id。appinfo还包含一个外键,用于首选项,称为"preferenceid“。我需要使用hibernate将preferences表的自动生成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现在为null。
发布于 2015-12-19 00:35:16
选项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);希望这能有所帮助。
https://stackoverflow.com/questions/34364910
复制相似问题