【问题标题】:Best way to insert into database?插入数据库的最佳方法?
【发布时间】:2012-11-25 20:36:37
【问题描述】:

我有一个要求,我需要从包含有关表名和每列值的信息的对象中插入数据库。 您能否就使用 Hibernate 实现此功能的最佳方式提出建议。

Java 类

public class InsertDataDetails {
  public String tableName;
  public List ColumnDetails> columnDetails;
}

public class ColumnDetails {
  public String columnName;
  public String columnValue;
}

目前我正在考虑创建一个本机查询并使用 Session.execute 查询执行它。但是我正在寻找更好的设计,我们可以在其中使用 DTO 类和休眠功能。

【问题讨论】:

    标签: java database hibernate design-patterns


    【解决方案1】:

    虽然你的问题没有提到 Spring,但我认为值得一提的是 Spring Data 项目。

    这为您提供了非常强大的持久性存储库,除了声明接口之外不需要任何实现。

    例如:

     public interface UserRepository extends JpaRepository<User,Long> {}
    

    Users 提供一个完全工作的类似 DAO 的对象,方法如下:

    List<User> findAll();
    User findOne(Long id);
    User save(User entity);
    

    但是,为了使用它,您需要遵循 @Duffymo 的建议,并围绕它们所代表的对象而不是它们的持久性来为您的类建模。

    【讨论】:

    • +1 推荐 Spring。这是一个绝妙的主意,但我敢打赌,这超出了 OP 的范畴。
    • 感谢您的建议。我们也在使用 Spring,并且还有一个与您提到的类似的实现类。您能否解释一下“围绕它们所代表的对象建模您的类,而不是它们的持久性”。
    【解决方案2】:

    所有这些建议都过于以关系为中心且过于简单化。我建议您放弃这种方法。

    您应该根据您要解决的问题来考虑对象,而不是持久性。如果您想使用 Hibernate,它可以将问题的 OO 表示映射到关系模式。

    我还建议您阅读 Martin Fowler 的 Patterns of Enterprise Application Architecture,了解持久性问题通常是如何在对象方面解决的。

    Google 数据访问对象。这是一个简单的通用的,很容易用 Hibernate 实现和扩展:

    package persistence;
    
    public interface GenericDao<K, V> {
        V find(K id);
        List<V> find();
        K insert(V value);
        void update(V value);
        void delete(V value);
    }
    

    关于对象的持久性已经解决了很多次,尽其所能。您提出的建议并不代表对现有技术的有意义的改进。

    【讨论】:

    • 您帖子的最后一段似乎过于苛刻,不符合 Stack Overflow 的精神。 blog.stackoverflow.com/2012/07/kicking-off-the-summer-of-love
    • 感谢您的回复。我们已经为您提到的类似接口提供了一个实现类。问题是如何从 InsertDataDetails 类创建 DTO Objects()。
    • 不要使用 DTO;只需使用您的模型类。
    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多