0

次のような IdClass がある場合

public class EmployeePK implements Serializable {

 private String empName;
 private Date birthDay;

 public EmployeePK() {
 }

 public String getName() {
     return this.empName;
 }

 public void setName(String name) {
     this.empName = name;
 }

 public Date getBirthDay() {
     return this.birthDay;
 }

 public void setBirthDay(Date date) {
     this.birthDay = date;
 }

 public int hashCode() {
     return (int)this.empName.hashCode();
 }

 public boolean equals(Object obj) {
     if (obj == this) return true;
     if (!(obj instanceof EmployeePK)) return false;
     EmployeePK pk = (EmployeePK) obj;
     return pk.birthDay.equals(this.birthDay) && pk.empName.equals(this.empName);
 }

}

@IdClass(EmployeePK.class)
@Entity
public class Employee implements Serializable{

   @Id String empName;
   @Id Date birthDay;
   ...

    public Employee (String empName, Date birthDay){
    this.empName= empName;
    this.birthDay= birthDay;
}
...
}

どのように更新クエリを作成しますか?

    EntityManagerFactory emf = Persistence
            .createEntityManagerFactory("JPA_Compositekey");
    EntityManager em = emf.createEntityManager();
    try {
        em.getTransaction().begin();
        Employee anemployee = em.find( **WHAT DO YOU FILL HERE **)
...

または、PK クラスのオブジェクトを使用する必要があります。また、更新する必要がある人物が 1 人しかいない場合はどうすればよいですか。

ありがとう

4

1 に答える 1

1

他のすべてのエンティティについては、ID のインスタンスを指定します。

EmployeePK pk = new EmployeePK(...);
Employee anemployee = em.find(Employee.class, pk);

従業員を更新するには、他のエンティティと同様に、そのフィールドを変更します。トランザクションがコミットされると、新しい状態が自動的に保持されます。名前と生年月日は更新しないように注意してください。これらは PK の一部であるため、不変です。これは、複合キー、特に機能複合キーを使用しない多くの正当な理由の 1 つです。

自動生成された代理キーを使用すると、すべてがはるかに簡単になります。

于 2012-12-04T22:41:34.380 に答える