java - 如何解决 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;
}
还有另外两个实体:
- 扩展 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(); } }
- 用户资料
@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
解决方案
推荐阅读
- javascript - 在导航器中找不到 serviceWorker
- python - 多行数据的堆积图
- sql - R Shinyapp 连接到服务器正常但发布驱动程序不正确
- node.js - npm pack “JavaScript 堆内存不足”
- c++ - 将 imagemagick blob 保存到节点缓冲区
- excel - 使用命令按钮将数据复制到多个 Excel 工作表中
- ffi - 如何添加一个又一个元素?
- php - Wordpress ACF 日期选择器字段不起作用
- amazon-s3 - 私有存储桶中 S3 文件的 URL
- python - ValueError:无法为具有形状“(128,?)”的张量“目标:0”提供形状(128,)的值