У меня есть следующие таблицы в 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
Является ли 'User' новый объект? Если да, попробовали ли вы предложения отсюда: http://stackoverflow.com/questions/17592247/in-jpa-having-a-many-to-one-as-primary-key-throws-referential-integrity-constra ? По сути, самым простым решением, похоже, является сохранение «User» сначала, а затем «AccessToken». Если нет, отправьте код, который вы используете для извлечения сущности 'User' из постоянного хранилища. – crizzis
Пользователь - существующая сущность, я могу решить эту проблему, передав собственный запрос на вставку, но через JPA он дает мне эту ошибку. – fareed
Вам нужно убедиться, что при вызове 'dao.persist (accessToken)' 'accessToken Поле .user' представляет собой управляемый объект. Самый простой способ достичь этого - вызвать 'accessToken.setUser (entityManager.getReference (User.class, userEntity.getId())) перед вызовом' dao.persist'. Тем не менее, вам абсолютно необходимо сделать все эти вызовы в рамках транзакции. – crizzis