java - Hibernate - 如何使用生成器为引用表创建主键?

标签 java mysql hibernate jpa orm

我正在努力让 Hibernate(使用 MySQL)从“主表”生成引用表的主键。我的问题是,我有一个包含 2500 万行的大表,现在我需要添加多个附加列,因为将来会添加更多列,所以我选择使用引用表的方式,而不是将列添加到主表(重建需要几个小时......:)

所以有一个主表和一个引用表。在我的构想中,引用表的主键应该从主表的主键生成。我可以首先插入一个条目到主表中,然后选择它并使用它的主键插入到引用表中,但是这个对我来说似乎不是最好的方法。所以我想使用 Hiibernate 的 generators,但我不知道如何使用。

这是主表:

@Entity 
@Table
public class Task {

    @Id
    @GeneratedValue
    @Column()
    private Integer id;

    // ...

    @OneToOne(mappedBy = "task_ref", orphanRemoval=true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Stuff stuff;

    // ...
}

以及引用表:

@Entity
@Table
public class Stuff {

    @Id
    @Column(name = "stuff_id")
    @GeneratedValue()
    private Integer stuff_id;

    // ...

    @OneToOne(orphanRemoval=true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private Task task_ref;

    // ...
}

那么..如何使用生成器从表 Task 的主键创建表 Stuff 的主键?

非常欢迎任何建议或其他解决方案!

谢谢!

最佳答案

这是您应该如何将双向 OneToOne 关联与共享主键映射:

@Entity 
@Table
public class Task {

    @Id
    @GeneratedValue
    private Integer id;

    // ...

    @OneToOne(mappedBy = "task_ref", orphanRemoval=true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Stuff stuff;

// ...
}

@Entity
@Table
public class Stuff {

    @Id
    @Column(name = "stuff_id")
    private Integer stuff_id;

    // ...

    @OneToOne(fetch = FetchType.LAZY)        
    @MapsId 
    @JoinColumn(name = "stuff_id") 
    private Task task_ref;

    // ...
}
  1. 只有父实体需要级联到子实体,而不是相反。
  2. 父级仅具有关联的“反向”端。
  3. 共享主键既是子实体中的主键,又是外键
  4. MapsId 注释允许您共享 @Id 和 OneToOne 关联的主键

关于java - Hibernate - 如何使用生成器为引用表创建主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25286745/

相关文章:

java - 获取应用服务器下的真实(虚拟)主机名

java.sql.SQLException : Before start of result set

php - 删除行 PHP

java - 尝试分配 HashSet 时出现 LazyInitializationException

java - Quarkus 中如何使用不同的数据源进行读写查询?

java - 如何以编程方式查找字符串中的特定字符

java - Eclipse 无法读取我的设备

mysql - 使用tomcat+JSP+JDBC删除MySQL列时eclipse错误 “com.mysql.jdbc.exceptions.MySQLSyntaxErrorException”

hibernate - 如何在 Hibernate 中禁用某些实体的模式验证?

java - 在Java中进行远程调用时要处理哪些异常