0

employee と phone_number という 2 つのテーブルがあり、employee が複数の番号を持つことができるとします。

たとえば、次の 2 つのテーブルがあります。

1) employee
columns:
id
name

2) phone_number
columns:
employee_id(FK)
phone_number_type
phone_number

employee と phone_number には、(FK として機能する phone_number の employee_id 列) との 1 対多のマッピングがあります。

モデル クラスで次の注釈を定義しました。

@Entity
@Table(name="employee")
public class Employee
@Id
@GeneratedValue
private Integer id;

@OneToMany(fetch = FetchType.LAZY, mappedBy="employee_id")
@JoinColumn(name = "ID")
private Set<PhoneNumber> phonenumbers = new HashSet<PhoneNumber>(0);

public Set<PhoneNumber> getPhonenumbers() {
return phonenumbers; 
}

public void setPhoneNumbers(Set<PhoneNumber> phonenumbers) {
this.phonenumbers = phonenumbers; 
}

クラス電話番号

@Entity
@Table(name="phone_number")
public class PhoneNumber {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "employee_id")
private Employee employeeid;

public Employee getEmployeeid() {
return this.employeeid;
}

public void setEmployeeid(Employee employeeid) {
this.employeeid = employeeid;
}

私の質問は、すべての従業員または特定の従業員を取得するときに、電話番号も取得したいということです。現在、デバッグ モードで実行すると、入力されている電話番号が表示されません。springmvc フレームワークで休止状態を実行しており、次のコードで従業員を取得しています。

@Override
@SuppressWarnings("unchecked")
public List<Employees> getEmployees() {
  // TODO Auto-generated method stub
  return getCurrentSession().createQuery("from Employees").list();
}

phone_numbers を返すために私がしなければならないことはありますか。私の最終的な目標は、従業員と電話番号を表形式でビューに表示することです。

ありがとうございました

「fetch = EAGER」を作成したときにデバッグしようとしましたが、値が表示されませんでした。電話データをプルしていることを確認するにはどうすればよいですか?

List<Employees> _employees= employeeService.getEmployees();
        for (Employees o: _employees) {
            java.util.Set<PhoneNumber> a = o.getPhonenumbers();
        }

犯した間違いを見つけましたが、別の問題に直面しています。私の間違いは、employee_id フィールドが FK であるにもかかわらず、適切に入力されていなかったことです。ただし、この列は phone_number テーブルの主キーではありません。

phone_number を次のように変更しました。

@Entity
@Table(name="phonenumber")
public class Phonenumber {


    @EmbeddedId
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "EMPLOYEEID")
    private Employee employeeid;

ただし、現在次のエラーが発生しています: 原因: org.hibernate.MappingException: Composite-id クラスは Serializable を実装する必要があります:

このエラーは解決できましたが、別の興味深いエラーが発生しています。電話番号の最初の行のみを選択しています。

@Entity
@Table(name="phonenumber")
public class Phonenumber implements Serializable {

    @Column(name="key")
    private String key;

    @Column(name="value")
    private String value;

    @Id
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "EMPLOYEEID")
    private Employee employee;

従業員

@Entity
@Table(name="employee")
public class Employee{

    @Id
    @GeneratedValue
    private Integer id;

    @OneToMany(mappedBy = "employeeid", fetch = FetchType.EAGER)
    private Set<Phonenumber> phonenumbers= new HashSet<Phonenumber>(0); 
4

5 に答える 5

1
  • それを使用HQLすると、次のように実現できます。

    createQuery("from employee e left join fetch e.phonenumbers")

  • 代わりに を使用できますEAGER loading。ただし、十分に注意して影響を考慮してください。関連するすべてのエンティティが読み込まれるため、パフォーマンスに影響を与える可能性があります。


あなたがエンティティに参加したい方法を言った@JoinColumnので、必要はありません。mappedByほとんどの場合@JoinColumn、一方向の関係に使用されるか、 がない場合に使用されますmappedBy

Phonenumber の employee 列から @Id を削除し、id主キーにしてください。

@Entity
@Table(name="phonenumber")
public class Phonenumber implements Serializable {

    @Column(name="key")
    private String key;

    @Column(name="value")
    private String value;

    @Id
    @GeneratedValue
    private Integer id;


    @ManyToOne(fetch=FetchType.EAGER)
    private Employee employee;

}

于 2013-09-17T20:26:07.117 に答える
0

フェッチタイプをeagerに変更してみましたか?

FetchType.LAZY
to
FetchType.EAGER

デバッグをオンにして、実行中の基になる sql ステートメントを表示することができます。

<property name="show_sql">true</property>

休止状態の構成で。それを使って確認します。

于 2013-09-17T19:46:11.487 に答える