2012-10-09 18 views
1

我正在使用ReverseMappingTool爲現有數據庫方案創建JPA來源。JPA - 具有一對多關係的實體不返回任何數據

它工作正常,但有一個例外:在創建之後,從一對多關係調用get-Methods數據時不會加載。

JPA的文件看起來像:

@Entity 
@Table(schema="myScheme", name="ORDER") 
@IdClass(org.company.OrderId.class) 
public class Order { 
    @OneToMany(targetEntity=org.company.Orderposition.class, mappedBy="order", cascade=CascadeType.MERGE) 
    private Set orderpositions = new HashSet(); 

public Set getOrderpositions() { 
    return bestellpositions; 
} 

public void setOrderpositions(Set orderpositions) { 
    this.orderpositions = orderpositions; 
} 

public Set getDependantPositions() { 
    if (getOrderpositions() != null) { 
     return getOrderpositions(); 
    } 
} 

和...

@Entity 
@Table(schema="myScheme", name="ORDERPOSITION") 
@IdClass(org.company.Orderposition.Id.class) 
public class Orderposition { 
    @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE) 
    @JoinColumn(name="intid_strbestellung", nullable=false) 
    private Order order; 

    public Order getOrder() { 
     return order; 
    } 

    public void setOrder(Order order) { 
     this.order = order; 
    } 

的方法 「getDependantPositions()」 只是我已經放在JPA類中的方法的例子。這是必要的,所以讓我們按照給定的。重點是,調用getOrderpositions()不會返回任何數據,儘管數據庫包含很多這個對象的條目。映射工具沒有爲@ OneToMany-Relationships添加任何FetchType ...所以我猜它的LAZY和調用getOrderpositions()應該返回所有相關的值。

你能幫我嗎?

謝謝!

P.S:那是我叫蘇氨酸ReverseMappingTool方式:

Options opts = new Options(); 
     // Output directory - All generated code and metadata will be written to the directory at this path 
     opts.setProperty("directory", PATH_SOURCEGENERATION); 
     // True to generate JPA annotations in generated java classes. 
     opts.setProperty("annotations", true); 
     // disable orm.xml generation 
     opts.setProperty("metadata", "none"); 
     // The full class name of a org.apache.openjpa.jdbc.meta.ReverseCustomizer customization plugin 
     opts.setProperty("customizerClass", JPAPropertiesReverseCustomizer.name); 
     // Create built-in application identity classes if possible 
     opts.setProperty("useBuiltinIdentityClass", false); 
     // Avoid creating classes for many-many join tables 
     opts.setProperty("primaryKeyOnJoin", true); 
     // Prevent the creation of inverse 1-many/1-1 relations for every many-1/1-1 relation detected 
     opts.setProperty("inverseRelations", true); 

     opts.setProperty("innerIdentityClasses", true); 
+0

你的代碼不能編譯。請修復這些問題,以便我們可以專注於實際的代碼。此外,如果toManyAssociation爲null,則測試將始終返回false。如果沒有關聯的實體,該集合將爲空,並且不爲null。請向我們展示無法按預期工作的代碼以及表格中的相關數據。最後,爲什麼不使用泛型? –

+0

嗨JB Nizet ...我把代碼稍微改了一些,在這裏張貼它。把德文名稱改爲英文等等。文件編譯得很好。 getDependantPositions()方法也是一個例子...它通常調用OnetoMany屬性的Get-Method ...我將添加泛型..感謝那些信息... – Randbedingung

回答

2

您應該配置你的日誌,讓你看到哪些查詢發送到數據庫。然後,您將能夠檢查:1.在加載Order時查詢哪些查詢,以及2.當您獲取由getOrderpositions()返回的Set的內容時,什麼(以及如果有的話)查詢進入數據庫。請注意,您必須訪問Set的內容,只調用getter將不會調用延遲加載關聯中的任何數據庫查詢。

+0

嗨,亞當,我打電話給getter,並試圖通過調用該集的迭代器等訪問元素,但它一直是空的。或者我必須使用屬性本身? – Randbedingung

+0

@Randbedingung您需要迭代Set。日誌呢?如果配置正確,它們會顯示ORM發送給數據庫的確切查詢,並驗證JPA是否按照您的預期行事。 –

+0

Sooooo ...它終於有效。我通過在OpenJpaVendorAdapter(Spring)中更改「showSql」屬性來設置調試方式。它沒有效果,sql查詢沒有被顯示。然後我意識到我用自己的類加載器實例化了JPA類。我能夠實例化它,但沒有「管理」JPa類。我的錯誤是不通過LocalContainerEntityManagerFactoryBean加載類。改變了,一切都很好:-)謝謝大家! – Randbedingung

0

默認情況下,一對多提取類型是懶惰。如果您希望加載這個數據,你必須使用JPQL語句

SELECT t FROM TABLE t JOIN FETCH t.joinedTable 

或者你在一對多映射指定FetchType.EAGER無處不在。但這意味着關係總是被加載。

參見例如:http://openjpa.apache.org/builds/1.1.0/docs/jpa_langref.html#jpa_langref_fetch_joins

塞巴斯蒂安

+0

嗨塞巴斯蒂安...我想過LAZY - fetchtype的意思是:首次調用時加載getOrderPositions()。我真的必須使用JPQL來獲取數據嗎? – Randbedingung

+0

你是對的,我的建議是當你想強制加載時連接到的。但是,你可能會強迫它查看是否加載了orderpositions或是否存在映射問題。 –

相關問題