2012-04-09 3 views

Trả lời

5

Có. Chỉ cần chú thích các trường/getter của thuộc tính @Formula bằng cách @Basic(fetch=FetchType.LAZY) và sử dụng ant task này được cung cấp bởi hibernate để làm công cụ bytecode cho lớp thực thể. Nếu không, tải LAZY cho thuộc tính @Formula bị bỏ qua âm thầm.

documentation chứa thông tin về cách sử dụng tác vụ kiến ​​này để thực hiện công cụ bytecode.

+0

cảm ơn câu trả lời của bạn, còn con quạ thì sao? là có một cách để đạt được điều này "bytecode thiết bị đo đạc" điều trong maven? Bởi vì tôi đang sử dụng maven và không có gì để làm với kiến. – destan

+0

bạn có thể sử dụng plugin 'maven-antrun-plugin' có thể chạy tác vụ Ant trong Maven. Xem: http: //doginpool.blogspot.com/2012/03/bytecode-instrumentation-for-hibernate.html –

+0

Thiết bị mã hóa Bytecode trong maven: http://tricksdev.blogspot.ru/2009/03/hibernate-bytecode -instrumentation.html –

2

Tôi thấy trong nhận xét rằng bạn muốn đạt được điều này mà không có công cụ bytecode. Điều này có thể đạt được bằng cách thực hiện giao diện FieldHandled và bằng cách sửa đổi getters và setters cho trường lười.

HBM

<property name="deletable" type="true_false" lazy="true"> 
    <formula>(select something from other tables and such....)</formula> 
</property> 

JAVA

import org.hibernate.bytecode.javassist.FieldHandled; 
import org.hibernate.bytecode.javassist.FieldHandler; 
public class Person implements FieldHandled { 

/* allows lazy formulas without hibernate bytecode instrumentation */ 
private FieldHandler fieldHandler; 
public FieldHandler getFieldHandler() { return fieldHandler; } 
public void setFieldHandler(FieldHandler fieldHandler) { this.fieldHandler = fieldHandler; } 


private Boolean deletable; 

public void setDeletable(Boolean deletable) { 
    if(fieldHandler!=null) 
     fieldHandler.writeObject(this, "deletable", this.deletable, deletable); 
    this.deletable = deletable; 
} 

public Boolean getDeletable() { 
    if(fieldHandler!=null) 
     return (Boolean)fieldHandler.readObject(this, "deletable", deletable); 
    return deletable; 
} 
} 

Một ví dụ khác có thể được tìm thấy here. Nhưng đó là lười biếng tải một mối quan hệ một-một.

+0

Tôi đã thử giải pháp của bạn nhưng tôi nhận được NPE trên 'org.hibernate.engine.spi.EntityEntry.isUnequivocallyNonDirty (EntityEntry.java:314)' bất kỳ ý tưởng nào? Và bạn đã sử dụng phiên bản ngủ đông nào? – Kakawait

+0

@Kakawait xin lỗi tôi không biết chính xác. Tôi đã viết mã này một lúc trở lại và tin rằng nó là 3.x (trong đó x là không rõ) – Danny

+0

Điều này làm việc cho tôi: không bận tâm bằng cách sử dụng fieldHandler cho setter này. Đó là một công thức không có gì để thiết lập trong DB – jpprade