Hibernate: невозможно сохранить объект с помощью JPA, когда объект содержит ссылку на сохраненный объект - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть таблица работодателя со схемой, содержащей 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, и поэтому я сделал inserttable = false и updatable = false в Employer.java, чтобы поле не обновлялось;

Нет, если я установил значение 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 голосов
/ 20 февраля 2012

Ваш работодатель ссылается на уже существующий профиль пользователя.Если он уже существует, он находится в базе данных.Если он находится в базе данных, вы не должны создавать новый экземпляр, а получать его из базы данных.Чтобы получить что-то из базы данных, вы используете метод EntityManager.find() или EntityManager.getReference() (второй даже не делает никаких операторов выбора).

Итак, удалите флаги insertable и updatableиз вашей аннотации (ассоциация вставляется ) и используйте код, подобный следующему:

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