0

我有以下实体: MissionInfo:

@Entity
@Table(name = "mission_info")
public class MissionInfo implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue
    private Long id;

    @OneToMany(cascade={CascadeType.ALL})
    @JoinColumn(name="mission_info_id")
    private List<Mission> missions;

    public MissionInfo() {
    }
    // getters and setters
}

使命:

@Entity
@Table(name = "mission")
public class Mission implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue
    private Long id;

    @Column(name = "mission_info_id")
    private Long missionInfoId;

    @ManyToOne
    @JoinColumn(name="mission_info_id", insertable=false, updatable=false)
    private MissionInfo missionInfo;

    public Mission() {
    }
    // getters and setters
}

正如我在这个计划所有者方面的理解 - MissionInfo

我使用以下代码进行保存: MissionInfo info = new MissionInfo();

Mission o = new Mission();

List<Mission> list = new ArrayList<Mission>();
list.add(o);
info.setMissions(list);

MissionInfo createdMissionInfo = missionInfoRepository.save(info);

MissionInfo mi = createdMissionInfo.getMissions().get(0).getMissionInfo(); <-- NULL
Long mId = createdMissionInfo.getMissions().get(0).getMissionInfoId(); <-- NULL

正确保存对象树,createdMissionInfo 有一个任务列表。但是在保存单个任务对象(createdMissionInfo.getMissions().get(0))后,missionInfoId 和missionInfo 中有NULL。

是否可以调整保存后将具有实际值的 jpa/hibernate 实体?像这样:

// should be a pointer to saved mission info
createdMissionInfo.getMissions().get(0).getMissionInfo(); 
// should be a id of saved mission info
createdMissionInfo.getMissions().get(0).getMissionInfoId();

谢谢!

更新:

我根据 kostja 评​​论更正实体:

@Entity
@Table(name = "mission_info")
public class MissionInfo implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "missionInfo", cascade=CascadeType.ALL)
    private List<Mission> missions;

}


@Entity
@Table(name = "mission")
public class Mission implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name="mission_info_id")
    private MissionInfo missionInfo;

}

但是当我使用此代码保存时:

MissionInfo info = new MissionInfo();
Mission o = new Mission();
List<Mission> list = new ArrayList<Mission>();
list.add(o);
info.setMissions(list);
MissionInfo createdMissionInfo = missionInfoRepository.save(info);

sql 外键 'mission_info_id' 为 NULL。我的主要问题没有解决:

MissionInfo mi = createdMissionInfo.getMissions().get(0).getMissionInfo(); <-- NULL
4

1 回答 1

2

你的假设并不完全正确。

  • 不是MissionInfo拥有方,而是Mission. 拥有方是存储关系信息的一方。在多对一关系中,多方是拥有方,因为它必须将单个 FK 存储到一方

  • 您的MissionInfo班级与Mission. 为此,请删除joinColumn注释并mappedBy为该字段添加一个属性missions

    @OneToMany(cascade=CascadeType.ALL, mappedBy="missionInfo")
    private List<Mission> missions;
    
  • 您可以从 中删除该missionInfoId字段Mission。由于字段上的 joinColumn 注释,该列已存在missionInfo

  • 如果您使 joinColumn 不可插入且不可更新,您将无法添加任何关系数据。删除这些属性:

    @ManyToOne
    @JoinColumn(name="mission_info_id")
    private MissionInfo missionInfo; 
    

持久化代码现在应该可以工作了。

编辑:我认为级联MissionInfo将负责节省。我不知道为什么它没有被触发。您可以做些什么来解决这个问题,就是在拥有方设置关系数据,即Mission. 然后你不必依赖级联:

Mission o = new Mission();
o.setMissionInfo(info);
// persist Mission
于 2014-01-20T07:05:16.690 回答