2017-02-17 86 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; 
} 

and

@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

用戶是一個新的實體嗎?如果是這樣,你有沒有嘗試從這裏的建議:http://stackoverflow.com/questions/17592247/in-jpa-having-a-many-to-one-as-primary-key-throws-referential-integrity-constra ?基本上,最簡單的解決方案似乎是先堅持「用戶」,然後是「AccessToken」。如果沒有,請發佈您用來從持久性存儲中獲取'User'實體的代碼。 – crizzis

+0

用戶是一個現有的實體,我可以通過傳遞本機插入查詢來解決這個問題,但通過JPA,它給了我這個錯誤 – fareed

+0

你需要確保當你調用'dao.persist(accessToken)'時,'accessToken .user'字段代表一個管理實體。最簡單的方法是在調用'dao.persist'之前調用'accessToken.setUser(entityManager.getReference(User.class,userEntity.getId()))'。不過,您絕對需要在交易範圍內完成所有這些呼叫。 – crizzis

回答

0

休眠由其主鍵識別的實體。 嘗試將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