【问题标题】:Hibernate/persistence and singleton pattern休眠/持久性和单例模式
【发布时间】:2012-10-07 21:57:40
【问题描述】:

我有一个要保存在数据库中的单例。其他持久化实体应该引用这个单例。用 Hibernate 是如何实现的?

我以类似这样尚未工作的东西结束,伪造了单例的单一 ID:

@Entity
@Subselect("select '1' as ID")
class Singleton {
    @Id
    @Column(name="ID")
    private Long getId() { return 1l; }
    private void setId(Long id) { }
}

@Entity
@Table(name="ENT")
class MyEnt {
    // TODO: how to annotate so that table ENT doesn't need foreign key column 
   Singleton s;
}

问题是我不想在引用单例的实体中有一个带有外键的列 - 因为单例只是一个,我们不需要它的 ID...

也许我想错了?也许这是错误的架构问题?你解决过类似的问题吗?

【问题讨论】:

    标签: java hibernate singleton persistence


    【解决方案1】:

    我以这个结尾:

    @Entity
    @Subselect("select '1' as ID, * from TABLE")
    class Singleton {
        @Id
        @Column(name="ID")
        private Long getId() { return 1l; }
        private void setId(Long id) { }
        // ... other useful fields persisted in TABLE
    }
    
    @Entity
    @Table(name="ENT")
    class MyEnt implements Lifecycle {
       Singleton s;
       void onLoad(Session sess, Serializable id) {
          this.s = sess.get(Singleton.class, 1l);
       }
       // etc...
    }
    

    【讨论】:

      【解决方案2】:

      如果Singleton 只是一个对象,为什么要映射到其他实体中呢?

      您可能想加载一次Singleton 并将其放入application context。在这种情况下,您可以在需要时重复使用它。

      【讨论】:

      • 是的,但是如果你需要重启容器或者你有很多容器怎么办?如何保存单例的当前状态?还是在所有容器中更改?
      • 我的意思是按照设计的方式设计该对象。我只是想说,我没有看到任何将其映射到其他实体的理由。加载一次对象并保存在应用程序上下文中。如果你碰巧重启了容器,请重新加载。
      • 1.因为数据库中的数据可以更改(webapp 在更多节点上) 2. 因为实体在其业务逻辑方法中需要单例。而且我不想“手动”将其放入其中。可以由 DAO 服务为此 DAO 服务加载的实体完成,但是如何处理间接加载的实体(由原始实体引用)?
      • 另外,我的问题没有提到 Spring 是一起使用的。虽然是真的,但最好能提供更通用的解决方案。
      • @Jakub 通过应用程序上下文,我不是指 Spring 应用程序上下文,而是指像 Tomcat Application Context 这样的对象。
      猜你喜欢
      • 2011-03-30
      • 2010-10-29
      • 1970-01-01
      • 2012-07-22
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2014-08-10
      相关资源
      最近更新 更多