【问题标题】:When I update one table, it inserts the value of mapped table in hibernate mapping当我更新一个表时,它会在休眠映射中插入映射表的值
【发布时间】:2020-05-20 06:17:35
【问题描述】:

我有两个模型,UserModelRoleModel,它们使用 @OneToOne 关系映射。当我更新用户详细信息时,它首先将数据插入角色表,然后将这些新角色更新为UserModel

UserModel.java

package com.example.demo.Model;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="Users")
public class UserModel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Integer id;

    @Column(name="name")
    private String name;

    @Column(name="address")
    private String address;

    @JoinColumn(name = "role", insertable=false, nullable = false, updatable = false)
    @OneToOne(cascade = CascadeType.ALL)
    private RoleModel roleModel;


    public UserModel() {
    }

    public UserModel(Integer id, String name, String address,RoleModel roleModel) {
        super();
        this.id = id;
        this.name = name;
        this.address = address;
        this.roleModel = roleModel;
    }

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public RoleModel getRoleModel() {
        return roleModel;
    }
    public void setRoleModel(RoleModel roleModel) {
        this.roleModel = roleModel;
    }
}

RoleModel.java

package com.example.demo.Model;

    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;

    @Entity
    @Table(name="Roles")
    public class RoleModel {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name="role")
        private Integer role;

        @Column(name="rolename")
        private String roleName;

        @OneToOne(mappedBy = "roleModel")
        private UserModel userModel;


        public RoleModel() {
        }


        public RoleModel(Integer role, String roleName) {
            super();
            this.role = role;
            this.roleName = roleName;
        }


        public Integer getRole() {
            return role;
        }
        public void setRole(Integer role) {
            this.role = role;
        }
        public String getRoleName() {
            return roleName;
        }
        public void setRoleName(String roleName) {
           this.roleName = roleName;
        }
    }

我想更新UserModel 以及角色,但这里RoleModel 插入一个新行然后它会更新。帮我解决这个问题。告诉我确切的代码,我应该使用哪些代码来仅更新来自 UserModel 关联角色的数据。

【问题讨论】:

  • 在您创建或修改模型的位置添加代码,并清楚说明您在持久化这些修改时预期会发生什么。

标签: spring-data-jpa hibernate-mapping one-to-one


【解决方案1】:

我首先建议研究弹簧关系注释的工作原理。您明确表示,当您在UserModel 中操作此对象时,不应插入或更新RoleModel,因此即使您使用所需值修改正确的信息,它也不会反映在数据库端。

@JoinColumn(name = "role", insertable=false, nullable = false, updatable = false)

因此,如果您从映射中删除 insertable=falseupdatable=false,它将起作用(考虑到右列也已映射)。

另外,我建议研究一些关于Spring JPA One-to-One mappings的教程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2023-03-14
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多