首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图编写两个具有一对一关系的表,但joinColumn出现空

试图编写两个具有一对一关系的表,但joinColumn出现空
EN

Stack Overflow用户
提问于 2015-12-18 22:31:54
回答 1查看 219关注 0票数 2

我在一个网页上有一个表单,需要放在两个不同的表中,appinfo和首选项。appinfo和首选项都有一个自动生成的id。appinfo还包含一个外键,用于首选项,称为"preferenceid“。我需要使用hibernate将preferences表的自动生成id输入到这个字段。

我使用SpringMVC创建了两个POJO,并试图将它们写入数据库。基本格式是:

Preferences.java:

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-19 00:35:16

选项1

如果希望AppInfo持有Preferences的外键,而Preferences不需要AppInfo的外键,则更改如下。

从首选项中删除映射

代码语言:javascript
复制
     @Entity
     @Table (name ="preferences")
     public class Preferences implements Serializable {

     //    @OneToOne(mappedBy)
     //    @JoinColumn(name="preferencesid", referencedColumnName="preferenceid")
     //    private AppInfo ai;

并在AppInfo中指定级联类型

代码语言:javascript
复制
@Entity
@Table (name ="appinfo")
public class AppInfo implements Serializable {

    @OneToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="preferenceid", referencedColumnName="preferencesid")
    private Preferences p;

如果您想让它成为cascade = CascadeType.ALL,那么,当您需要保存实例时,如下所示。

代码语言:javascript
复制
    AppInfo ai = new AppInfo();     
    Preferences p = new Preferences();

    ai.setP(p);     
    session.persist(ai); 

如果设置为cascade = CascadeType.ALL,则可以使用session.save(ai);

选项2

如果希望这两个表彼此保存一个外键,则更改如下。

代码语言:javascript
复制
@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。当你保存实例时,

代码语言:javascript
复制
    AppInfo ai = new AppInfo();     
    Preferences p = new Preferences();

    ai.setP(p);     
    p.setAi(ai);

    session.persist(ai);

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34364910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档