2017-11-11 194 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