我在网页上有一个表单,需要放在两个不同的表中,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);

希望这有帮助。

07-24 21:05