簡體   English   中英

帶有反向主外鍵級聯的零到一單向休眠

[英]Hibernate Zero to One unidirectional with reverse primary foreign key cascade

我在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實體中的UserInfo實例不為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;
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM