当前位置: 首页 > 知识库问答 >
问题:

在Hibernate中保持一对一关系实体-实体已分离

毛弘博
2023-03-14

我有两张一对一的表:

用户:

create table users (

  id int not null primary key,
  username varchar2(40) not null unique,
  password varchar2(60) not null,
  firstName varchar2(40) not null,
  lastName varchar2(40) not null,
  personalId varchar2(11) unique,
  city varchar2(40),
  address varchar2(40),
  email varchar2(40) not null unique,
  phone varchar2(9) unique
);

用户数

    create table usersAccounts (
  id int primary key,
  accountNr varchar2(26) not null unique,
  balance float not null,
  createDate date not null,
  expiredDate date,
  lastCharge date,
  userId int constraint userAccount_fk_user references users(id),
);

我的实体:

使用者

    @Entity
@Table(name = "users")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;
    @NotBlank
    @NotNull
    @Size(min = 3, max = 40)
    @Column(name = "username")
    private String username;
    @NotBlank
    @NotNull
    @Size(min = 3, max = 60)
    @Column(name = "password")
    private String password;
    @NotBlank
    @NotNull
    @Size(min = 3, max = 40)
    @Column(name = "firstName")
    private String firstName;
    @NotBlank
    @NotNull
    @Size(min = 3, max = 40)
    @Column(name = "lastName")
    private String lastName;
    @Size(min = 11, max = 11)
    @Column(name = "personalId")
    private String personalId;
    @Size(max = 40)
    @Column(name = "city")
    private String city;
    @Size(max = 40)
    @Column(name = "address")
    private String address;
    @NotBlank
    @NotNull
    @Email
    @Size(max = 40)
    @Column(name = "email")
    private String email;
    @Size(min = 9, max = 9)
    @Column(name = "phone")
    private String phone;
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<UserRole> userRoleSet;
    @OneToOne(mappedBy = "user")
    private UserAccount userAccount;

用户账户

    @Entity
@Table(name = "usersAccounts")
public class UserAccount implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;
    @NotNull
    @Column(name = "accountNr")
    private String accountNr;
    @NotNull
    @Column(name = "balance")
    private float balance;
    @NotNull
    @Column(name = "createDate")
    private Date createDate;
    @Column(name = "expiredDate")
    private Date expiredDate;
    @Column(name = "lastCharge")
    private Date lastCharge;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "userId")
    private User user;

我试图坚持这一点,但我有错误:

    @RequestMapping(value = "/admin/addAdmin", method = RequestMethod.POST)
public String addAdmin(@ModelAttribute("user") UserDto userDto,
        BindingResult result) {
    AddUserValidator addUserValidator = new AddUserValidator();
    addUserValidator.validate(userDto, result);
    if (result.hasErrors()) {
        return "admin/addadmin";
    } else {
        ErrorMessage errorMessage;
        User user = prepareModelUser(userDto);
        if ((errorMessage = userService.createUser(user)) != null) {
            result.rejectValue(errorMessage.getPath(),
                    errorMessage.getDescription());
            return "admin/addadmin";
        } else {
            user = userService.findByUsername(user.getUsername());
            UserRole userRole = new UserRole("ROLE_ADMIN");
            userRole.setUser(user);
            userRoleService.createUserRole(userRole);
            UserAccount ua = new UserAccount();
            ua.setAccountNr("12345678901");
            ua.setBalance(100);
            DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            Date date = new Date();
            String dateStr = dateFormat.format(date);
            try {
                ua.setCreateDate(dateFormat.parse(dateStr));
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            user = userService.findUser(user.getId());
            ua.setUser(user);
            userAccountService.createUserAccount(ua);
            return "redirect:/admin/adminlist";
        }
    }
}

当我尝试坚持我得到这个错误:

严重:Servlet。路径为[/ibank]的上下文中servlet[appServlet]的服务()引发了异常[Request processing failed;嵌套异常为javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:Distached entity传递给persistent:pl.piotr.ibank.model.User],其根本原因为org。冬眠PersistentObjectException:传递给persist:pl.piotr的分离实体。ibank。模型使用者

userRole.setUser(user); userRoleService.createUserRole(userRole);保存良好,但当我尝试ua.setUser(user); userAccount tService.createUserUser(ua);我得到分离的实体

共有1个答案

郑景胜
2023-03-14

让主键同时成为外键是非常糟糕的做法。尤其是当上面有@GeneratedValue时。

仔细观察,您的实体映射正常,但需要调整usersAccounts表。从id列中删除外键约束,并添加新列userId,该列将是users#id的外键。之后一切都会好起来的。

 类似资料:
  • 我有一个实体: 要创建上述实体并将其保存到JPA存储库中,我将执行以下操作: 由于DB中的表存储了候选对象的FK,我认为设置一个id就足够了。但JPA希望我设置候选对象。这迫使我查询候选存储库。 是否需要从候选库中查询候选人以保存,或者如果我有可用的候选人id,我不能直接设置它?

  • 我在删除子实体项目时遇到问题。每次我删除它的时候,什么都没有发生,父节点和子节点之间的关联仍然存在。我在网上搜索过,有些人建议使用orphanremoval,但我试过了,没有用。如果任何人可以建议,不胜感激。我的代码如下: 资产实体 (CHILD) 是单向关系,因此资产实体不包含任何@ManyToOne 在我的 SQL 数据库表中,我的关系CLIENTPROFILE_CLIENTASSET,它们通

  • 问题内容: 我在父方使用批注具有一对一关系。现在,我想自己保存子实体。 例如,我有和作为孩子的实体,我需要保存(父的id属性设置为之后的课程)。但是,当使用这种安排时,我在下面列出了一个例外… 为什么hibernate不允许这样做的任何想法?更清楚地说,我的代码如下… ParentEntity: ChildEntity: 我尝试保存的方式是… 关于如何尝试保存子实体,任何指针将不胜感激。 问题答案

  • 我已经试着解决这件事很长一段时间了,但我什么也没得到。我一直在试图保存一个实体,该实体拥有对另一个实体的引用。 用户通过填写表单创建一个place实体,然后按save保存该实体。它应该自动在“places”和“place\u url”表中创建新行。下面是我正在加载到应用程序中的SQL文件的链接:https://pastebin.com/x8Gvk7ub 母实体: 子实体: 控制器: Hiberna

  • 救命啊!我只在一对多关系数据库中插入POJO时遇到问题。我有POJO和误解如何插入数据库中的所有列表??? 请帮帮我伙计们!

  • 我是Spring BootJPA的新手,正在努力找出多个实体之间的关系。 我有一个用户实体、一个产品实体和一个评论实体。一个用户有很多评论。一个产品有很多评论。评论有一个产品和一个用户。 目前,我正在为用户使用一对多的关系 我的问题: 如何在不删除产品实体和用户实体的情况下删除审阅实体? 我应该使用哪种级联类型? 用户实体: 产品实体: 审查实体: 用户控制器: 用户服务: 简单运行: 我认为我不