首页 > 解决方案 > 如何解决 org.hibernate.PropertyValueException

问题描述

我有一个 BaseEntity 作为超类:

@MappedSuperclass
public abstract class BaseEntity<ID> {

    public static final String IS_DELETED = "is_deleted";

    @Id
    @GeneratedValue
    private ID id;

    @Column(name = IS_DELETED, columnDefinition = "TINYINT(1)")
    private Boolean isDeleted;
}

还有另外两个实体:

  1. 扩展 BaseEntity 的用户
    @Entity
    @Table(name = User.TABLE_NAME)
    public class User extends BaseEntity<Long> {
    
        public static final String TABLE_NAME = "user";
        public static final String USER_NAME = "user_name";
        public static final String PASS_WORD = "pass_word";
        public static final String IS_ACTIVE = "is_active";
    
        @Column(name = USER_NAME)
        private String userName;
    
        @Column(name = PASS_WORD)
        private String passWord;
    
        @Column(name = IS_ACTIVE, columnDefinition = "TINYINT(1)")
        private Boolean isActive;
    
        @OneToOne(mappedBy = TABLE_NAME, cascade = CascadeType.ALL)
        private UserProfile userProfile;
    
        public User(){
            userName = null;
            passWord = null;
            isActive = null;
            userProfile = new UserProfile();
        }
    }
    
  2. 用户资料
    @Entity
    @Table (name = UserProfile.TABLE_NAME)
    public class UserProfile {
    
        public static final String TABLE_NAME = "user_profile";
        public static final String FIRST_NAME = "first_name";
        public static final String LAST_NAME = "last_name";
        public static final String PHONE_NUMBER = "phone_number";
        public static final String EMAIL = "email";
        public static final String AGE = "age";
        public static final String USER_ID = "user_id";
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        @Column(name = FIRST_NAME)
        private String firstName;
    
        @Column(name = LAST_NAME)
        private String lastName;
    
        @Column(name = PHONE_NUMBER)
        private String phoneNumber;
    
        @Column(name = EMAIL)
        private String email;
    
        @Column(name = AGE)
        private Integer age;
    
        @OneToOne
        @JoinColumn(name = USER_ID, nullable = false)
        private User user;
    }
    

在我的 UserService 中,当用户想要注册时,我设置了 UserProfile 字段,如 firstName、lastName 等。然后将 User 对象传递到存储库以保存它,并且当我将 cascadeType 设置为 all 时,不应该有问题,因为 UserProfile 应该被插入到数据库中,或者我错过了什么:

public class UserServiceImpl {

    public void signUp() {
        User user = new User();
        user.getUserProfile().setId(user.getId());

        System.out.println("Enter firstname:");
        user.getUserProfile().setFirstName(ApplicationContext.getStringScanner().nextLine());

        System.out.println("Enter lastname:");
        user.getUserProfile().setLastName(ApplicationContext.getStringScanner().nextLine());

        System.out.println("Enter username:");
        String userName = ApplicationContext.getStringScanner().next();

        while (repository.getUserByUserName(userName) != null) {
            System.out.println("\nUsername not available!");
            System.out.println("Enter username:");
            userName = ApplicationContext.getStringScanner().next();
        }
        user.setUserName(userName);

        System.out.println("Enter Password:");
        String passWord = ApplicationContext.getStringScanner().next();
        user.setPassWord(passWord);

        System.out.println("Enter Your Phone Number:");
        String phoneNumber = ApplicationContext.getStringScanner().next();
        user.getUserProfile().setPhoneNumber(phoneNumber);

        System.out.println("Enter Your Email:");
        String email = ApplicationContext.getStringScanner().next();
        user.getUserProfile().setEmail(email);

        System.out.println("Enter Your age:");
        Integer age = ApplicationContext.getStringScanner().nextInt();
        user.getUserProfile().setAge(age);

        repository.save(user);
    }
}

保存在 UserRepository 中:

@Override
public void save(User user) {
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();
    entityManager.persist(user);
    entityManager.getTransaction().commit();
    entityManager.close();
}

但是,在调用 UserService signUp 方法后,我得到了这个异常:

org.hibernate.PropertyValueException:非空属性引用空值或瞬态值:model.UserProfile.user

标签: javahibernate

解决方案


推荐阅读