嵌套关系实体中传递的空值 - Spring Boot

时间:2017-12-13 13:46:57

标签: java spring-boot spring-data spring-data-jpa

我试图将用户对象与地址一起保存。在User课程内,我定义了与Address的关系。在Address内,我定义了User

创建对象并尝试将其保存到数据库时,请收到以下错误:

  

SqlExceptionHelper:ERROR:“user_id”列中的空值违反非空约束

@Entity
class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String address;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id")
    private User user;

    //getter setter
}

用户类;

class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @OneToMany(cascade = CascadeType.ALL)
    private List<Address> address;

    //Other fields, getters, & setters
}

UserService类;

class UserService {

    public long createUser(User user) {

        User u = new User();
        Address address = new Address();
        address.setAddress("Windsong Palace");
        address.setZipCode("239749");

        List<Address> adds = new ArrayList<>();
        adds.add(address);

        u.setAddress(adds);
        //userRepository is the interface extends from JpaRepository<User, Long>
        userRepository.save(u);
    }
}

如何在创建user_id课程后传递Address

2 个答案:

答案 0 :(得分:2)

错误表明您的地址对象没有对用户对象的引用。

如果查看代码,则不要为地址字段设置用户。试试这个:

...
address.setAddress("Windsong Palace");
address.setZipCode("239749");
address.setUser(u);
...

答案 1 :(得分:0)

我弄明白了这个问题。这是由于liquibase。我正在使用liquibase和我的应用程序。在liquibase xml文件中,我创建了表UserAddress。在application.propertiesspring.jpa.hibernate.ddl-auto=none

但是在创建用户和地址时。存储库的save无法在user_id中插入Address,它正在插入null

转动liquibase.enabled=false(删除liquibase)解决了这个问题。

我认为这不是更好的解决方案。但是,它的工作没有liquibase。