有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何解决org。冬眠PropertyValue异常

我有一个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等,然后将用户对象传递到存储库以保存它。当我将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);
    }
}

保存在用户存储库中:

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

但是,在调用UserService注册方法后,我得到以下异常:

org.hibernate.PropertyValueException: not-null property references a null or transient value : model.UserProfile.user


共 (0) 个答案