我有一个包含userprofileId架构的雇主表
如下所述的雇主表包含userprofileid,它是用户表的主键
id int(11) (not NULL) PRI
userprofileid int(11) (not nUll)
organization_name varchar(50) (not nUll)
现在我的要求是为这个雇主创建一个JPA课程。
现在我们有了Employer.java,下面是条目。
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name="userProfileId", referencedColumnName="id" )
@Column( insertable=false ,updatable =false)
private UserProfile userProfile;
@Column(name = "organization_name")
private String organizationName;
现在是障碍了。 我们的UserProfile是以不同方法创建的对象。现在我不想再次向userprofile表添加相同的值,因此我在employer.java中使insertable = false和updatable = false,以便该字段不会更新;
否,如果我在雇主对象中设置userprofile的值
它说
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.hcentive.core.user.UserProfile; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.hcentive.core.user.UserProfile
但如果我没有设置用户个人资料,则会给出以下错误。
Caused by: java.sql.SQLException: Field 'userprofileid' doesn't have a default value
注意我坚持使用:
getJpaTemplate().persist(t);
答案 0 :(得分:0)
您的雇主是指现有的用户个人资料。如果它已经存在,则它在数据库中。如果它在数据库中,则不能创建新实例,而是从数据库中获取它。要从数据库中获取内容,请使用EntityManager.find()
或EntityManager.getReference()
方法(第二种方法甚至不执行任何select语句)。
因此,请从注释中删除insertable
和updatable
标记(关联 可插入),并使用类似于以下代码的代码:
UserProfile up = em.getReference(UserProfile.class, userProfileId);
employer.setUserProfile(up);
em.persist(employer);