尝试编写具有一对一关系的两个表,但 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);

希望这对您有所帮助。