我有以下的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
用戶是一個新的實體嗎?如果是這樣,你有沒有嘗試從這裏的建議:http://stackoverflow.com/questions/17592247/in-jpa-having-a-many-to-one-as-primary-key-throws-referential-integrity-constra ?基本上,最簡單的解決方案似乎是先堅持「用戶」,然後是「AccessToken」。如果沒有,請發佈您用來從持久性存儲中獲取'User'實體的代碼。 – crizzis
用戶是一個現有的實體,我可以通過傳遞本機插入查詢來解決這個問題,但通過JPA,它給了我這個錯誤 – fareed
你需要確保當你調用'dao.persist(accessToken)'時,'accessToken .user'字段代表一個管理實體。最簡單的方法是在調用'dao.persist'之前調用'accessToken.setUser(entityManager.getReference(User.class,userEntity.getId()))'。不過,您絕對需要在交易範圍內完成所有這些呼叫。 – crizzis