Перестаньте думать на SQL, начните думать на EntityManager
.
Проект p = entityManager.find (Project.class, 122);
p.setId (123);
p.setName ( "Intel");
entityManager.merge (р);
Тем не менее, это почти всегда неправильный выбор изменения первичного ключа объекта .
Зачем вам менять личность сущности? Вам также необходимо обновить все внешние ключи в других таблицах, которые на него указывают. Похоже на боль, без выгоды. Возможно, вам лучше сделать это «бизнес-ключом» (обычное свойство) и использовать более постоянный суррогатный ключ.
Если вы действительно должны иметь возможность изменить идентификационный номер проекта, вы должны изменить первичный ключ на автоматически инкрементный номер. Сущность будет выглядеть примерно так:
@Entity
public class Project
{
@Id @GeneratedValue
private int id;
private int projectId;
private String projectName;
// getters and setters
}
Итак, вы хотите связать проекты с пользователями.
Вы можете сделать это, если идентификатор проекта (строка, например, "LK987"
) является первичным ключом (который, я уверен, теперь вы понимаете, что изменять его не следует) & mdash; или вы можете использовать отдельный автоинкремент int
в качестве идентификатора. Тебе решать; Мое личное предпочтение - подход автоинкремента, так что вам не нужно беспокоиться об этом позже.
То, что вы пытаетесь сделать, это установить отношения между Project
сущностями и User
сущностями. Вместо хранения полей внешнего ключа следует хранить поля entity (для сопоставлений один-к-одному, один-ко-многим или многие-к-одному) или наборы сущностей (для сопоставлений один-ко-многим) сопоставления «многие к одному» или «многие ко многим»). Если я понимаю, что вам нужно:
- У каждого пользователя может быть несколько проектов, и у каждого проекта может быть несколько пользователей (так что сопоставление много-ко-многим)
- Пользователи знают о проектах, и проекты могут также знать о пользователях (поэтому отображение является двунаправленным). Я предполагаю, что
User
является владельцем отношений, а Project
является обратной стороной.
Это означает, что вы будете использовать аннотацию @ManyToMany
и указать @JoinTable
и какие @JoinColumn
s использовать.
Класс сущности пользователя
@Entity
public class User
{
@Id @GeneratedValue
int id; // the PK for user entities
@ManyToMany
@JoinTable(
name="user_project_table",
joinColumns=@JoinColumn(name="user_id"),
inverseJoinColumns=@JoinColumn(name="project_id"))
Set<Project> projects;
// snip...
}
Класс сущности проекта
@Entity
public class Project
{
@Id @GeneratedValue
int id;
String projectId;
String projectName;
@ManyToMany(mappedBy="projects")
Set<User> users;
// snip...
}
Обратите внимание, что мы используем полноценные классы сущностей, а не только внешние ключи.