Как сделать два столбца в качестве первичного ключа в классе аннотации hibernate
Это мой класс аннотаций, и я хочу userId
а также groupId
столбец как первичный ключ. Я нашел больше вопросов ( Вопрос) по этому поводу, но не нашел соответствующего ответа. У меня меньше репутации, поэтому я не могу комментировать посты, поэтому я задаю свой вопрос здесь.
Это мой код..
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.NaturalId;
@Entity
@Table(name="user_group")
public class user_group {
@Column(name="serviceProvider")
private String serviceProvider;
@Column(name="enterpriseId")
private String enterpriseId;
@Column(name="department")
private String department;
@Column(name="trunkGroupName")
private String trunkGroupName;
@Id
@Column(name="userId")
private String userId;
@Column(name="groupId")
private String group;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getGroup() {
return group;
}
public void setGroup(String group) {
this.group = group;
}
public String getServiceProvider() {
return serviceProvider;
}
public void setServiceProvider(String serviceProvider) {
this.serviceProvider = serviceProvider;
}
public String getEnterpriseId() {
return enterpriseId;
}
public void setEnterpriseId(String enterpriseId) {
this.enterpriseId = enterpriseId;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public String getTrunkGroupName() {
return trunkGroupName;
}
public void setTrunkGroupName(String trunkGroupName) {
this.trunkGroupName = trunkGroupName;
}
}
2 ответа
Вы должны создать новый @Embeddable
класс, содержащий поля PK:
@Embeddable
public class user_groupId implements Serializable {
@Column(name="userId")
private String userId;
@Column(name="groupId")
private String group;
}
И использовать его в @Entity
как @EmbeddedId
:
@Entity
public class user_group {
@EmbeddedId
user_groupId id;
...
}
Вы также можете использовать @IdClass
аннотация на этот счет.
Этот превосходный ответ Паскаля Тивента развивает детали. Вы также можете взглянуть на этот другой ответ, который я опубликовал на почти идентичный вопрос некоторое время назад.
В качестве дополнительного примечания: если у вас есть контроль над структурой БД, вы также можете не использовать составные ключи. Есть несколько причин для этого.
Вы можете создать составной первичный ключ в спящем режиме, используя аннотацию @UniqueConstraint.
@Table(name="user_group",uniqueConstraints=@UniqueConstraint(columnNames= {"userId","groupId"}))
public class user_group
{
@Column(name="userId")
private String userId;
@Column(name="groupId")
private String group;
}
Приведенный выше метод неосуществим, если мы используем пружину, потому что для создания составного первичного ключа нам нужно создать класс, это не очень хорошая вещь.
в hibernate и spring вам нужно только создавать классы POJO, которые доступны в вашей системе как сущность.