Hibernate:当对象包含已保存对象的引用时,无法使用JPA保存对象

时间:2012-02-20 11:59:30

标签: hibernate jpa-2.0 hibernate-mapping

我有一个包含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);

1 个答案:

答案 0 :(得分:0)

您的雇主是指现有的用户个人资料。如果它已经存在,则它在数据库中。如果它在数据库中,则不能创建新实例,而是从数据库中获取它。要从数据库中获取内容,请使用EntityManager.find()EntityManager.getReference()方法(第二种方法甚至不执行任何select语句)。

因此,请从注释中删除insertableupdatable标记(关联 可插入),并使用类似于以下代码的代码:

UserProfile up = em.getReference(UserProfile.class, userProfileId);
employer.setUserProfile(up);
em.persist(employer);