2012-09-19 30 views
8

Tôi có 2 thực thể ngủ đông/bảng và cần kết hợp thông tin từ cả hai để sử dụng trong một khung nhìn. Các bảng làCách tốt nhất để tham gia 2 bảng sử dụng hibernate

Table Client: 
    clientId, 
    firstName, 
    lastName, 
    phone, 
    cellPhone 

Table Appointment: 
    apptTime, 
    clientId (and some other fields I don't need now) 

Có mối quan hệ một-nhiều giữa khách hàng và cuộc hẹn, dựa trên clientID. Trong SQL thông thường tôi chỉ muốn nói điều gì đó như:

Select 
    client.clientId, 
    appt.apptTime, 
    client.firstName, 
    client.lastName 
from 
    Client client, 
    Appointment app 
where 
    client.clientId = appt.clientId 

và sử dụng bản ghi đã được trả lại.

Tôi không chắc chắn cách thực hiện điều này trong Hibernate. Tôi có nên tạo ra một thực thể ClientAppt và sau đó làm một cái gì đó như trên chọn (sửa đổi phần nào cho HQL)?

Lưu ý, tôi đã nghĩ đến việc sử dụng phương pháp tiếp cận SecondaryTable, nhưng tôi nghĩ rằng yêu cầu mối quan hệ 1 đến 1? Tôi cho rằng tôi có thể lập bản đồ từ một đến nhiều, nhưng có cách nào khác không? Đây là một sự thay đổi một lần và lập bản đồ một mối quan hệ một đến nhiều có thể là một chút tốn kém cho một cái gì đó nhỏ này? Cách tiếp cận tốt nhất là gì? Cảm ơn

Trả lời

2

Bạn có thể lập mô hình theo nhiều cách này. Những gì tôi sẽ làm là yêu cầu Khách hàng là một Thực thể và có các cuộc hẹn khác nhau là một bộ sưu tập phần tử. Bạn không nói rõ ngôn ngữ, nhưng trong Java nó sẽ như thế nào:

@Entity 
@Table(name="person") 
public class ClientAppts { 
    ... 

    @OneToMany(mappedBy="client") 
    Set<Appointment> appointments; 
} 

@Entity 
@Table(name="person") 
public class Appointment { 
    .... 

    @ManyToOne 
    @JoinColumn(name="person_id") 
    private ClientAppts client; 

    .... 
}  

Bạn có thể sau đó lấy Khách hàng sử dụng bất cứ phương pháp nào bạn thích, với hạnh phúc đơn giản nhất:

session.get(Client.class, clientId); 

Hibernate sẽ làm tham gia và trả về một đối tượng Client với một tập các cuộc hẹn. Bạn có thể tiếp tục làm cho thiết lập một SortedSet, hoặc thêm một chỉ mục vào nó để biến nó thành một List.

+0

Cảm ơn, sharakan. Tôi nghĩ tôi sẽ thử phương pháp này và xem điều gì xảy ra. – Dave

+0

sharakan, tôi đã thử phương pháp của bạn nhưng tôi gặp lỗi. Mô tả ở đây - http: // stackoverflow.com/questions/12502850/class-not-map-exception-nhưng-nó-là-ánh xạ – Dave

+0

OK, từ định nghĩa của cuộc hẹn bạn có trong đó (đặc biệt là thực tế bạn có một ID, mà tôi đã không nhận thức được) , Tôi nghĩ bạn thực sự muốn có một thực thể. Tôi sẽ cập nhật câu trả lời của mình. Tôi không thể bình luận về unmapped-ness mặc dù, tôi không quen thuộc với cách Glassfish không cấu hình. – sharakan

1

Bạn nên sử dụng Projections.alias để chỉ định danh sách các cột bạn quan tâm. Hãy xem hướng dẫn sử dụng ngủ đông here chẳng hạn.

0

Bạn có chú thích mã của mình bằng siêu dữ liệu mối quan hệ không? Nếu bạn đã làm bạn sẽ có thể chỉ cần truy vấn cho danh sách các khách hàng và sau đó nhận được các cuộc hẹn của họ truy cập vào lĩnh vực đang nắm giữ chúng.

4

Cách "Tốt nhất" (imho) không phải là suy nghĩ về cách SQL bình thường. Đừng nghĩ đến việc lựa chọn một số lĩnh vực và có các bảng bạn đang tham gia. Bạn nên cố gắng tạo ra các thực thể kinh doanh có ý nghĩa và bạn nên làm việc trên các thực thể kinh doanh đó.

Ví dụ, đây là những gì tôi sẽ làm gì:

(mã không thực tế, chỉ hiển thị các ý tưởng)

@Entity 
public class Client { 
    @Id 
    @Column(name="clientId") 
    private Long id; 

    @Column 
    private String longName; 
} 

@Entity 
public class Appointment { 
    @Id 
    private Long id; 

    @ManyToOne 
    @Column(name="clientId") 
    private Client client; 
} 

Với các bản đồ ở trên, những gì bạn cần làm là gì khác hơn là một HQL from Appointment a where a.client.id = :whatEverIdYouWant, hoặc, để lưu các truy vấn thêm để DB, from Appointment a join fetch a.client where a.client.id = :whatEverIdYouWant

bạn cũng có thể thêm bản đồ @ sharakan nếu thiết kế của bạn không ngại khách hàng tùy thuộc vào Bổ nhiệm

0
public class Appoinment { 

@Override 
public List<Appointment > methodName(String search) { 
    String hql =" from Appointment a join fetch a.client where a.client.id = 
        :search"; 

    Query<Appointment > query=this.getSession().createQuery(hql,Appointment 
      .class); 
    Long id=-1L; 
    try { 
     id=Long.parseLong(search); 
    }catch (NumberFormatException ex) { 
     ex.printStackTrace(); 
    } 
    query.setParameter("id", id); 
    query.setParameter("search", "%" +search+ "%"); 
    return query.getResultList(); 
} 

} 
Các vấn đề liên quan