2017-11-11 86 views
0

我目前在我的(小)項目中使用分層體系結構,並考慮使用用於插入/更新/刪除方法的反射來擴展我的BaseRepository(類特定的存儲庫從中繼承)。分層體系結構 - 存儲庫和反射

BaseRepository.java看起來是這樣的:

public abstract class BaseRepository<CLASS extends BaseDomain<CLASS>>{ 

} 

哪裏BaseDomain就是:

public class BaseDomain<CLASS extends BaseDomain<CLASS>> { 
    private Long id; 

    //getters setts etc. 
} 

現在我的問題是在deleteById方法在BaseRepository:

public int deleteById(Connection connection, Long id) throws SQLException { 
    PreparedStatement delete= connection.prepareStatement("DELETE FROM ? WHERE id = ?"); 
    delete.setObject(1, entity) //heres the problem, where do I get entity from? 
    delete.setObject(2, id); 

    return 0; 
} 

我的具體版本庫像這樣擴展了Base:

public class UserRepository extends BaseRepository<User>{ 

} 

如何得到User類的BaseRepository所以我可以用它在刪除/更新等方法呢?

感謝您的幫助!

+0

我不認爲你需要一個連接對象的方法的參數列表。 – kevinjom

回答

1

如何使實體成爲BaseRepository構造函數的參數。

編輯:

public class UserRepository extends BaseRepository<User>{ 

    public static final String ENTITY = "users";   

    public UserRepository(){ 
     super(ENTITY); 
    }  

} 
+0

這是否意味着每次你需要創建一個新的Repository實例?你在查詢時是否需要該實體實例? – kevinjom

1

一個簡單的方法我能想到的,但我沒有試過是實體類的類型傳遞給BaseRepository

private final Class<CLASS> entityType; 
public BaseRepository(Class<CLASS> entityType) { 
    this.entityType = entityType; 
// do your stuff 
} 

查找要根據實體類類型進行操作的正確表。如果實體類型爲User,那麼可以按照慣例與大多數Ruby ORM一樣,然後您可以針對usersuser或任何慣例進行操作。

或者可以有一個目的是提供一種配置,以BaseRepository