2017-02-17 18 views
0

У меня есть следующие таблицы в Postgres:Частный объект передается упорствовать с первичным ключом, также внешний ключ

create table USER(
    USER_ID SERIAL primary key, 
    USER_NAME varchar(50) not null, 
    PASSWORD varchar(120) not null, 
) 

И

create table ACCESS_TOKEN(
    USER_CODE INTEGER, 
    TOKEN_CREATED DATE, 
    TOKEN_VALUE VARCHAR(100), 

    primary key (USER_CODE, TOKEN_CREATED), 
    foreign key (USER_CODE) references USER(USER_ID), 
) 

и я создал следующие объекты

@Entity 
@Table(name="USER") 
public class User implements Serializable{ 

    @Id 
    @SequenceGenerator(name = "USER_USER_ID_SEQ_GEN", sequenceName = "USER_USER_ID_SEQ", initialValue=1, allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_USER_ID_SEQ_GEN") 
    @Column(name="USER_ID") 
    private int id; 

    @Column(name="USER_NAME") 
    private String name; 

    @Column(name="PASSWORD") 
    private String password; 
} 

и

@Entity 
@Table(name = "ACCESS_TOKEN") 
@IdClass(AccessToken.AccessTokenPK.class) 
public class AccessToken implements Serializable{ 

    @Id 
    @JoinColumn(name="USER_CODE", referencedColumnName = "USER_ID") 
    @ManyToOne 
    private User user; 

    @Id 
    @Column(name="TOKEN_CREATED") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date created; 


    @Column(name = "TOKEN_VALUE") 
    private String token; 


    public static class AccessTokenPK implements Serializable{ 
     protected int user; 
     protected Date created; 

     //constructor, hashbode, and equals 
    } 

} 

Однако, когда я пытаюсь оставаться маркер доступа следующим образом:

AccessToken accessToken = new AccessToken(); 
accessToken.setUser(userEntity); 
accessToken.setCreated(new Date()); 
accessToken.setToken("some string"); 
// persist token 
dao.persist(accessToken); 

Я получаю следующее сообщение об ошибке

detached entity passed to persist: User 
+0

Является ли 'User' новый объект? Если да, попробовали ли вы предложения отсюда: http://stackoverflow.com/questions/17592247/in-jpa-having-a-many-to-one-as-primary-key-throws-referential-integrity-constra ? По сути, самым простым решением, похоже, является сохранение «User» сначала, а затем «AccessToken». Если нет, отправьте код, который вы используете для извлечения сущности 'User' из постоянного хранилища. – crizzis

+0

Пользователь - существующая сущность, я могу решить эту проблему, передав собственный запрос на вставку, но через JPA он дает мне эту ошибку. – fareed

+0

Вам нужно убедиться, что при вызове 'dao.persist (accessToken)' 'accessToken Поле .user' представляет собой управляемый объект. Самый простой способ достичь этого - вызвать 'accessToken.setUser (entityManager.getReference (User.class, userEntity.getId())) перед вызовом' dao.persist'. Тем не менее, вам абсолютно необходимо сделать все эти вызовы в рамках транзакции. – crizzis

ответ

0

Hibernate распознает объекты по его первичному ключу. попробуйте установить GenerationType.AUTO для первичного ключа Пользователя,

@Entity 
@Table(name="USER") 
public class User implements Serializable{ 

    @Id 
    @SequenceGenerator(name = "USER_USER_ID_SEQ_GEN", sequenceName = "USER_USER_ID_SEQ", initialValue=1, allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "USER_USER_ID_SEQ_GEN") 
    @Column(name="USER_ID") 
    private int id; 

    @Column(name="USER_NAME") 
    private String name; 

    @Column(name="PASSWORD") 
    private String password; 
} 




@Entity 
@Table(name = "ACCESS_TOKEN") 
@IdClass(AccessToken.AccessTokenPK.class) 
public class AccessToken implements Serializable{ 

    @Id 
    @ManyToOne(cascade = {CascadeType.ALL},fetch= FetchType.EAGER) 
    @JoinColumn(name="USER_CODE", referencedColumnName = "USER_ID") 
    @ManyToOne 
    private User user; 

    @Id 
    @Column(name="TOKEN_CREATED") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date created; 


    @Column(name = "TOKEN_VALUE") 
    private String token; 


    public static class AccessTokenPK implements Serializable{ 
     protected int user; 
     protected Date created; 

     //constructor, hashbode, and equals 
    } 

} 
+0

Это дало мне ту же ошибку – fareed

+0

как вы создаете userEntity? здесь, accessToken.setUser (userEntity); попробуйте жестко закодировать первичный ключ и передать его, если он работает, тогда это проблема. – zillani

+0

вот так, UserEntity userEntity = new UserEntity(); userEntity.setId (1234); – zillani