java - Hibernate 零到一单向,具有反向主外键级联

标签 java mysql spring hibernate jpa

我在 Spring Boot 中遇到 Hibernate 问题。

我们有 2 个表,usersuser_info,具有零到一(因此可以为空的一对一)关系。 user_info 有一个指向 users.user_id 的主外键:

CREATE TABLE `users` (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(45) NOT NULL,
  ...
  PRIMARY KEY (`user_id`)
) 

CREATE TABLE `users_info` (
  `user_id` bigint(20) NOT NULL,
  `name` varchar(45) NOT NULL,
  `surname` varchar(45) NOT NULL,
  `mail` varchar(45) DEFAULT NULL,
  ...
  PRIMARY KEY (`user_id`),
  KEY `fk_user_id_idx` (`user_id`),
  CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) 
    REFERENCES `users` (`user_id`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION
)

这些是模型:

@Entity
@Table(name = "users")
public class User implements UserDetails, Buildable<User.Builder> {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private Long id;

    private String username;

    @Nullable
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="user_id")
    @JsonUnwrapped
    private UserInfo userInfo;


    ...
}


@Entity
@Table(name = "users_info")
public class UserInfo {
    @Id
    @Column(name = "user_id")
    private Long id;

    @Nullable
    private String name;

    @Nullable
    private String surname;

    ...
}

当我使用此配置运行 Spring 应用程序时,它会抛出一个错误:

org.hibernate.id.IdentifierGenerationException ids for this class must be manually assigned before calling save()

如果 User 实体不为 null,我们如何级联持久化 UserInfo 实例?

感谢您的回答!

最佳答案

您的映射是向后的。 UserInfo 应引用其所附加的用户,并且是关联的所有者。而且你还应该说,它的ID也是用户的外键。

@Entity
@Table(name = "users")
public class User implements UserDetails, Buildable<User.Builder> {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private Long id;

    private String username;

    @Nullable
    @OneToOne(mappedBy="user", cascade = CascadeType.ALL)
    @JsonUnwrapped
    private UserInfo userInfo;


    ...
}


@Entity
@Table(name = "users_info")
public class UserInfo {
    @Id
    @Column(name = "user_id")
    private Long id;

    @Nullable
    private String name;

    @Nullable
    private String surname;

    @OneToOne
    @MapsId
    private User user;
    ...

关于java - Hibernate 零到一单向,具有反向主外键级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44717813/

相关文章:

java - 创建 Java 扩展的最佳工具是什么?

java - 并发进程向数据库中插入数据

mysql - SQL产品过滤器

mysql - 更新整个表添加上一行的值

eclipse - 运行 Tomcat + Spring + Maven 项目时出现 NoClassDefFoundError (Eclipse)

java - 无法删除 spring-hibernate 中的实体

java - 为什么我会收到 java.lang.NumberFormatException : For input string: "∞"?

mysql - 如何使用MySQL更改全文索引最小字长?

Spring的RestTemplate : complex object to query params

java - 如何用一个替换 'n' 反斜杠 (\)?