首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate中具有相同主键的一对一单向映射

hibernate中具有相同主键的一对一单向映射
EN

Stack Overflow用户
提问于 2018-04-19 12:33:13
回答 1查看 4.1K关注 0票数 1

我有两个具有一对一关系的类/表(Metafile和RowCount)。Rowcount只适用于某些元文件。目前,我已设置(简化):

MetaFile.java

代码语言:javascript
复制
@Entity
@Table(name = "file")
public class MetaFile {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "file_id")
    private int fileId;
    // getters, setters, constructors...
}

RowCount.java

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

    @OneToOne
    @JoinColumn(name="file_id")
    private MetaFile file;

    @Id
    @Column(name="file_id")
    private int file_id; // duplicate field needed so that crudrepo would recognise the id

    private int rows;

    public RowCount(MetaFile file, int rows) {
        this.file = file;
        this.rows = rows;
        this.file_id = file.getFileId();
    }
    // getters, setters...
}

我正在使用粗存储库对两者简化坚持。

我首先保存图元文件以获得分配的ID,然后使用该图元文件创建一个具有新ID的行计数对象并保存它(如下所示)。但是,第二次保存失败了,因为元文件没有立即保存到数据库中,外键约束也失败了。

代码语言:javascript
复制
metaFile = fileRepository.save(metaFile);

rowCountRepository.save(new RowCount(metaFile,getNumberOfRows(file));

metaFile肯定会获得分配给它的有效id。是否有办法确保这两种情况按顺序持续发生?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-19 12:59:30

您可以按照哈迪J的建议,用@mapsId更改映射,以便在RowCount中有一个pk/fk列

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

   @OneToOne
   @JoinColumn(name = "file_id")
   @MapsId
   private MetaFile file;

   @Id
   @Column(name="file_id")
   private int file_id;

   private int rows;

   public RowCount(MetaFile file, int rows) {
       this.file = file;
       this.rows = rows;
   }
   // getters, setters...

}

我会使用双向关系来简化保存:

代码语言:javascript
复制
@Entity
@Table(name = "file")
public class MetaFile {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "file_id")
    private int fileId;
    // getters, setters, constructors...

    @OneToOne(cascade = {CascadeType.ALL}, mappedBy = "file")
    private RowCount rowCount;
}

这样,您就可以设置关系并保存

代码语言:javascript
复制
RowCount rowCount = new RowCount(metaFile, getNumberOfRows(file));
metaFile.setRowCount(rowCount);
metaFile = fileRepository.save(metaFile);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49921243

复制
相关文章

相似问题

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