Перестаньте думать на SQL, начните думать на EntityManager
. Project p = entityManager.find(Project.class, 122); p.setId(123); p.setName("Интел"); сущностьМенеджер.слияние(р);
Тем не менее, почти всегда неправильный выбор изменить первичный ключ сущности.
Зачем вам менять личность сущности? Вам также потребуется обновить все внешние ключи в других таблицах, которые указывают на него. Похоже на боль, без выгоды. Вам, вероятно, лучше сделать это «бизнес-ключом» (обычным свойством) и использовать более постоянный суррогатный ключ.
Если вам действительно нужна возможность изменить идентификационный номер проекта, вы должны изменить первичный ключ на автоматически увеличивающийся номер. Сущность будет выглядеть примерно так:
@Entity
public class Project
{
@Id @GeneratedValue
private int id;
private int projectId;
private String projectName;
// getters and setters
}
Итак, вы хотите связать проекты с пользователями.
Вы можете либо сделать это, где идентификатор проекта (строка, например "LK987"
) является первичным ключом (который, я уверен, вы понимаете, что вы не должны его менять), либо вы можете использовать отдельный автоинкремент int
в качестве идентификатора. Тебе решать; лично я предпочитаю автоинкрементный подход, так что вам просто не придется беспокоиться об этом позже.
То, что вы пытаетесь сделать, это установить отношения между Project
сущностями и User
сущностями. Вместо хранения полей внешнего ключа следует хранить поля entity (для сопоставлений один-к-одному, один-ко-многим или многие-к-одному) или наборы сущностей (для сопоставлений "один-к-одному"). многие, многие-к-одному или многие-ко-многим отображения). Если я понимаю, что вам нужно:
- У каждого пользователя может быть несколько проектов, и у каждого проекта может быть несколько пользователей (чтобы сопоставление было «многие ко многим»).
- Пользователи знают о проектах, а проекты могут также знать о пользователях (поэтому сопоставление является двунаправленным). Я предполагаю, что
User
является владельцем отношения, а Project
является обратной стороной.
Это означает, что вы должны использовать аннотацию @ManyToMany
. и укажите @JoinTable
и какой @JoinColumn
для использования.
Класс сущности пользователя
@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...
}
Обратите внимание, что мы используем полноценные классы сущностей, а не только внешние ключи.
person
Matt Ball
schedule
11.06.2011