web-dev-qa-db-ja.com

hibernateアノテーションクラスで主キーとして2つの列を作成する方法

これは私の注釈クラスであり、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;
}


}
8
amit bhardwaj

PKフィールドを含む新しい@Embeddableクラスを作成する必要があります。

@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アノテーションを使用してその効果を実現することもできます。

これは、Pascal Thiventによる 優れた回答 で詳細を詳しく説明しています。 this を見て、ほぼ同じ質問に対して私が少し前に投稿した他の回答も確認できます。

補足として、DB構造を制御できる場合は、複合キーを避けることも検討してください。 そうする理由はいくつかあります

19
Xavi López

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

複合主キーを作成するためにクラスを作成する必要があるため、Springを使用する場合、上記の方法は適切ではありません。
休止状態と春には、システム上のエンティティとして使用可能なPOJOクラスを作成するだけで済みます。

0
Solanki Vaibhav