web-dev-qa-db-fra.com

comment créer deux colonnes en tant que clé primaire dans la classe d'annotation hibernate

Ceci est ma classe d'annotation et je veux userId et groupId colonne à la fois comme clé primaire . J'ai trouvé plus de questions ( Question ) à ce sujet, mais je n'ai pas trouvé de réponse pertinente . , je ne peux donc pas commenter les articles, je pose donc ma question ici.

Ceci est mon code ..

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;
}


}
7
amit bhardwaj

Vous devriez créer une nouvelle classe @Embeddable contenant les champs PK: 

@Embeddable
public class user_groupId implements Serializable { 
    @Column(name="userId")
    private String userId;

    @Column(name="groupId")
    private String group;
}

Et utilisez-le dans le @Entity en tant que @EmbeddedId

@Entity
public class user_group {

    @EmbeddedId
    user_groupId id;

    ...
}

Vous pouvez également utiliser l'annotation @IdClass à cet effet. 

Cette excellente réponse de Pascal Thivent détaille les détails. Vous pouvez également consulter this une autre réponse que j’ai posée à une question presque identique il ya quelque temps.

Remarque: si vous avez le contrôle de la structure de la base de données, vous pouvez également envisager d'éviter les clés composites. Il y a quelques raisons de le faire .

19
Xavi López

vous pouvez créer une clé primaire composite dans hibernate à l'aide de l'annotation @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;
}

la méthode ci-dessus n'est pas faisable si vous utilisez spring, car pour créer une clé primaire composite, nous devons créer une classe, ce n'est pas une bonne chose.
en veille prolongée et printemps, il vous suffit de créer des classes POJO qui sont disponibles en tant qu’entité sur votre système.

0
Solanki Vaibhav