2009-12-11 77 views

回答

1

讓班級執行java.io.Serializable,這樣您就可以獲得一個InputStream它可以使用CallableStatement#setBinaryStream()存儲在數據庫中。

這就是說,這通常被認爲是一個糟糕的設計。如果該類實際上是一個Javabean類,那麼最好創建一個包含表示Javabean屬性的列的表。例如。一個public class User { private Long id; private String name; private Integer age; }應該被映射到一個表像CREATE TABLE user (id BIGINT AUTO_INCREMENT, name VARCHAR, age INTEGER)

編輯爲您的評論的答覆:你這樣基本上要存儲數組作爲二進制對象。這是一個非常糟糕的主意。這樣你就不能在數據庫中搜索數組的數據,並且數據庫也不能再被移植了。只需創建一個代表每個數組項的新表。添加一個額外的列它表示父對象(實際上,它應當是其被映射包含數組父對象表的PK的ID

例:

public class Parent { 
    private Long id; 
    private String someData; 
    private List<Child> children; 
    // Add/generate public getters/setters. 
} 

public class Child { 
    private Long id; 
    private String someData; 
    // Add/generate public getters/setters. 
} 

應該映射到

CREATE TABLE parent (
    id BIGINT NOT NULL AUTO_INCREMENT, 
    someData VARCHAR, 

    PRIMARY KEY (id) 
); 

CREATE TABLE child (
    id BIGINT NOT NULL AUTO_INCREMENT, 
    parent_id BIGINT NOT NULL, 
    someData VARCHAR, 

    PRIMARY KEY (id), 
    FOREIGN KEY (parent_id) REFERENCES parent(id) 
); 

這樣你可以選擇所有與JOIN條款的幫助。在檢查的w3schools.com SQL教程和例子供應商特定的SQL文檔。

+0

感謝您的快速回復。但我有一些用戶(根據你的例子),所以我用博客。任何替代方案?我,e計劃看起來像這樣: recordid - 整數 - 主鍵 用戶[] - blob – 2009-12-11 14:25:38

+0

因此,你基本上想要在數據庫中存儲數組?這是一對多的關係?只需創建一個新表格,並將額外的列代表FK到父表格/行。這樣你可以將每個數組插入一個新行。 – BalusC 2009-12-11 15:06:49

0

如何構建java對象並在存儲過程中使用它?

這是不可能的,至少與MySQL無關。與支持Java Stored Procedures的Oracle不同,MySQL的存儲過程語法基於普通的ANSI SQL標準。所以我沒有看到如何從存儲在BLOB中的流中構建一個Java對象。你可以做的是訪問BLOB,但這不會幫助你很多恕我直言。

其實我覺得你在這裏完全是錯誤的道路,使用BLOB並不是正確的路要走(至少不在這裏)。如果您需要堅持它們之間具有1:n關係的對象,則需要相應地建模數據庫。

如果您Record類有一個與User類,這是我的理解一對多的關係,那麼你有這樣的事情在Java端:

public class Record { 
    private Long id; 
    private User[]; 
    //... 
} 

然後你需要創建兩個表在數據庫級別,一個用於記錄和其他用戶(一個或多個),並建立一個使用外鍵它們之間的關係(這樣你就可以「附加」用戶記錄):最後

CREATE TABLE record 
(
    record_id INT NOT NULL, 
    ..., 
    PRIMARY KEY (record_id) 
) TYPE = INNODB; 

CREATE TABLE user 
(
    user_id INT NOT NULL, 
    record_id INT, 
    ... 
    PRIMARY KEY (user_id), 
    INDEX (record_id), 
    FOREIGN KEY (user_id) REFERENCES record (record_id) 
) TYPE = INNODB; 

,當堅持一個來自Java的實例,您需要在兩個表中寫入狀態。