简体   繁体   English

Spring不会在oneToMany关系中保存List

[英]Spring doesn't save List in oneToMany relationship

I've this Address Entity我有这个地址实体

package com.appdeveloperblog.app.ws.io.entity;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity(name = "addresses")
public class AddressEntity implements Serializable {
private static final long serialVersionUID = 3652691377296902875L;

@Id
@GeneratedValue
private long id;

@Column(length = 30, nullable = false)
private String addressId;

@Column(length = 15, nullable = false)
private String city;

@Column(length = 15, nullable = false)
private String country;

@Column(length = 100, nullable = false)
private String streetName;

@Column(length = 7, nullable = false)
private String postalCode;

@Column(length = 10, nullable = false)
private String type;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "users_id")
private UserEntity userDetails;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getAddressId() {
    return addressId;
}

public void setAddressId(String addressId) {
    this.addressId = addressId;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
}

public String getCountry() {
    return country;
}

public void setCountry(String country) {
    this.country = country;
}

public String getStreetName() {
    return streetName;
}

public void setStreetName(String streetName) {
    this.streetName = streetName;
}

public String getPostalCode() {

        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public UserEntity getUserDetails() {
        return userDetails;
    }

    public void setUserDetails(UserEntity userDetails) {
        this.userDetails = userDetails;
    }

}

and this a Users Entity这是一个用户实体

package com.appdeveloperblog.app.ws.io.entity;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

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

    private static final long serialVersionUID = -3772691377276902875L;

    @Id
    @GeneratedValue
    private long id;

    @Column(nullable = false)
    private String userId;

    @Column(nullable = false, length = 50)
    private String firstName;

    @Column(nullable = false, length = 50)
    private String lastName;

    @Column(nullable = false, length = 120, unique = true)
    private String email;

    @Column(nullable = false)
    private String encryptedPassword;

    private String emailVerificationToken;

    @Column(nullable = false)
    private Boolean emailVerificationStatus = false;

    @OneToMany(mappedBy = "userDetails", cascade = CascadeType.ALL)
    private List<AddressEntity> addresses;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEncryptedPassword() {
        return encryptedPassword;
    }

    public void setEncryptedPassword(String encryptedPassword) {
        this.encryptedPassword = encryptedPassword;
    }

    public String getEmailVerificationToken() {
        return emailVerificationToken;
    }

    public void setEmailVerificationToken(String emailVerificationToken) {
        this.emailVerificationToken = emailVerificationToken;
    }

    public Boolean getEmailVerificationStatus() {
        return emailVerificationStatus;
    }

    public void setEmailVerificationStatus(Boolean emailVerificationStatus) {
        this.emailVerificationStatus = emailVerificationStatus;
    }

}

and this function which I use it in service layer to save the data into the Mysql Database我在服务层使用这个函数将数据保存到Mysql数据库中

@Override
    public UserDto createUser(UserDto user) {

        if (userRepository.findByEmail(user.getEmail()) != null)
            throw new RuntimeException("Record already exists");

        for(int i = 0 ; i < user.getAddresses().size() ; i++)
        {
            AddressDTO address = user.getAddresses().get(i);
            address.setUserDetails(user);
            address.setAddressId(utils.generateAddressId(30));
            user.getAddresses().set(i, address);
        }

        ModelMapper modelMapper = new ModelMapper();
        UserEntity userEntity = modelMapper.map(user, UserEntity.class);

        String publicUserId = utils.generateUserId(30);

        userEntity.setUserId(publicUserId);
        userEntity.setEncryptedPassword(bCryptPasswordEncoder.encode(user.getPassword()));

        UserEntity storedUserDetails = userRepository.save(userEntity);

        // BeanUtils.copyProperties(storedUserDetails, returnValue);

        UserDto returnValue = modelMapper.map(storedUserDetails, UserDto.class);

        return returnValue;
    }

after I post the data to the API using Postman POST request it save only the data into the users table and all the data in addresses table have been igonred在我使用 Postman POST 请求将数据发布到 API 后,它只将数据保存到用户表中,并且地址表中的所有数据都已被忽略

POST request Example: POST 请求示例:

{
"firstName" : "Sergey",
"lastName" : "Kargopolov",
"email" : "tno@test.com",
"password" : "123",
"addresses":[
    {
        "city":"Vancouver",
        "country":"Canada",
        "streetName":"123 Street name",
        "postalCode": "ABCBA",
        "type":"billing"
    }
    ]
}

Below classes are the stripped down version of what you are trying to achieve.下面的类是您想要实现的精简版本。 Please compare with your classes and it should work fine only difference is I have remove additional fields to test it easily.请与您的课程进行比较,它应该可以正常工作,唯一的区别是我删除了其他字段以轻松对其进行测试。 Check code in UserController map method.检查UserController map 方法中的代码。

UserEntity.java用户实体.java

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

    private static final long serialVersionUID = 4865903039190150223L;
    @Id
    @GeneratedValue
    private long id;

    @Column(length = 50, nullable = false)
    private String firstName;

    @Column(length = 50, nullable = false)
    private String lastName;

    @OneToMany(mappedBy = "userDetails", cascade = CascadeType.ALL)
    private List<AddressEntity> addresses;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public List<AddressEntity> getAddresses() {
        return addresses;
    }

    @Override
    public String toString() {
        return "UserEntity [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", addresses="
                + addresses + "]";
    }

    public void setAddresses(List<AddressEntity> addresses) {
        this.addresses = addresses;
    }

}

AddressEntity.java地址实体.java

@Entity(name = "addresses")
public class AddressEntity implements Serializable {
    private static final long serialVersionUID = 3652691377296902875L;

    @Id
    @GeneratedValue
    private long id;

    @Column(length = 15, nullable = false)
    private String city;

    @Column(length = 15, nullable = false)
    private String country;

    @JsonIgnore
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "users_id")
    private UserEntity userDetails;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public UserEntity getUserDetails() {
        return userDetails;
    }

    public void setUserDetails(UserEntity userDetails) {
        this.userDetails = userDetails;
    }

    @Override
    public String toString() {
        return "AddressEntity [id=" + id + ", city=" + city + ", country=" + country + "]";
    }

}

UserDto.java UserDto.java

public class UserDto implements Serializable {
    private static final long serialVersionUID = 6835192601898364280L;
    private long id;
    private String firstName;
    private String lastName;
    private List<AddressDTO> addresses;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public List<AddressDTO> getAddresses() {
        return addresses;
    }

    public void setAddresses(List<AddressDTO> addresses) {
        this.addresses = addresses;
    }

}

AddressDTO.java地址DTO.java

public class AddressDTO {

    private long id;

    private String city;

    private String country;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

}

UserController.java用户控制器.java

@RestController
public class UserController {

    @Autowired
    UserRepository repository;

    @PostMapping("map")
    @ResponseBody
    public UserEntity map(@RequestBody UserDto userDto) {
        ModelMapper modelMapper = new ModelMapper();
        UserEntity userEntity = modelMapper.map(userDto, UserEntity.class);
        for (AddressEntity address : userEntity.getAddresses()) {
            address.setUserDetails(userEntity);
        }
        repository.save(userEntity);
        return userEntity;
    }
}

Sample Request:样品请求:

{
"firstName" : "Sergey",
"lastName" : "Kargopolov",
"addresses":[
    {
        "city":"Vancouver",
        "country":"Canada"
    }
    ]
}

Output:输出:

{
    "id": 7,
    "firstName": "Sergey",
    "lastName": "Kargopolov",
    "addresses": [
        {
            "id": 8,
            "city": "Vancouver",
            "country": "Canada"
        }
    ]
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM