尝试编写具有一对一关系的两个表,但 joinColumn 为空
Trying to write two tables with one to one relationship but the joinColumn comes up null
我在网页上有一个表单需要放入两个不同的 tables,appinfo 和 preferences。 appinfo 和 preferences 都有一个自动生成的 id。 appinfo 还包含首选项调用 "preferenceid" 的外键。我需要使用 hibernate 将首选项 table 的自动生成 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;
}
当我持久化数据时,Preferences 工作正常,它会自动生成它的 id 值。但是我的 AppInfo 没有正确获取 preferencesid;它只有空。如果我更改 table 以允许空值,两者都将插入所有正确的信息,除了 AppInfo table 中的 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);
希望这对您有所帮助。
我在网页上有一个表单需要放入两个不同的 tables,appinfo 和 preferences。 appinfo 和 preferences 都有一个自动生成的 id。 appinfo 还包含首选项调用 "preferenceid" 的外键。我需要使用 hibernate 将首选项 table 的自动生成 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;
}
当我持久化数据时,Preferences 工作正常,它会自动生成它的 id 值。但是我的 AppInfo 没有正确获取 preferencesid;它只有空。如果我更改 table 以允许空值,两者都将插入所有正确的信息,除了 AppInfo table 中的 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);
希望这对您有所帮助。