2013-04-11 25 views
5

tôi có những thực thể:Hibernate tải một proxy lười biếng, nhưng tôi chỉ cần PK

@Entity 
public class Room { 

    @ManyToOne(optional=true,fetch=FetchType.LAZY) 
    private Player player1; 

    ... 

} 

@Entity 
public class Player { 

    @Id 
    @Column(updatable=false) 
    private long id; 

    public long getId() { 
     return id; 
    } 

    ... 

} 

Bây giờ, tuyên bố này bên Room ...

player1.getId(); 

... sẽ gây ra toàn bộ mà Player thực thể được tìm nạp từ cơ sở dữ liệu. Tuy nhiên, tôi chỉ cần khóa chính của nó, id, mà nó cần phải có (nếu không làm thế nào nó có thể lấy dữ liệu?).

Tôi làm cách nào để truy cập số id của proxy lười biếng mà không kích hoạt quyền truy cập cơ sở dữ liệu?

Trả lời

4

Hibernate nên giữ id của đối tượng liên quan cũng với dòng Session. Và có phương thức getIdentifier() trên số Session để nhận id. Tài liệu này không nói bất cứ điều gì về nó, nhưng thông thường nó không nên khởi tạo đối tượng.

+0

Cảm ơn, điều này hoạt động tốt. –

1

Bạn có thể có thuộc tính là @Column private long playerId trên thực thể Phòng. Bạn có thể gọi thuộc tính này để lấy id mà không cần phải gọi toàn bộ đối tượng Player trong giao dịch.

Điều này sẽ chỉ hoạt động nếu playerId cũng được lưu trữ trong bảng thực thể phòng (hoặc xem v.v.), nhưng tôi cho rằng nó phải là cần thiết để có thể tham gia ngay từ đầu.

chỉnh sửa: như @ Adam Dyga đề cập dưới đây, đó nên là insertable và có thể cập nhật cả hai như là sai

@Entity 
public class Room { 

    @ManyToOne(optional=true,fetch=FetchType.LAZY) 
    private Player player1; 
    @Column(name="id", insertable = false, updatable = false) 
    private long playerId 
    ... 

} 
+0

Và nếu bạn đi theo cách này, đừng quên đánh dấu một trong số chúng là "insertable = false, updateable = false" –

+0

Cảm ơn, tôi sẽ cập nhật câu trả lời của tôi – david99world

0

Tôi đã tìm thấy một giải pháp đơn giản hơn, đó là thực hiện getId()final. Điều này sẽ ngăn Hibernate ghi đè nó bằng hành động tìm nạp lười trong proxy, vì vậy nó sẽ chỉ trả lại ID đã biết, mà không gây ra bất kỳ vấn đề nào.

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