Hibernate:带有Annotations动态表名的数据对象

时间:2011-12-20 09:43:20

标签: java hibernate annotations

我有一个与表关联的Hibernate数据类;想象一下这样的实体 Person

 @Entity
 @org.hibernate.annotations.Proxy(lazy=false)
 @Table(name="Person", schema="MySchema")
 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
 public class ProfileData implements Serializable {

    private static final long serialVersionUID = -844564646821609090L;

    public PersonData() {
    }

    @Column(name="idPerson", nullable=false, unique=true)   
    @Id 
    ...

我需要按照此表的多年创建历史表:Person2010,Person2011,Person2012 ...是否可以在不创建新数据对象的情况下进行创建?也许通过一个参数......?我不知道。

Entity类是相同的,更改表名和构造函数。

6 个答案:

答案 0 :(得分:19)

另一个架构,更完美但更优雅:

,您可以使用 NamingStrategies 更改表名:

public class MyNamingStrategy extends DefaultNamingStrategy {
   ...
   @Override
   public  String tableName(String tableName) {
      return tableName+yearSuffixTable;
   }
   ...
}

而且,当你想使用_year表时,你必须使用Hibernate创建一个覆盖rhe表名的会话:

  SessionFactory sessionFactory;
  Configuration config = new AnnotationConfiguration()
                         .configure("hibernate.cfg.xml")
                         .setNamingStrategy( new MyNamingStrategy () );
  sessionFactory = config.buildSessionFactory();
  session = sessionFactory.openSession();

对于我的架构,我按年创建会话并将其存储到应用程序地图中,以便在需要时进行访问。

感谢。

答案 1 :(得分:3)

您应该尝试使用Hibernate Envers来获取历史数据。

答案 2 :(得分:1)

在Hibernate中,您将1个类映射到1个表。您不能重复使用相同的实体来动态映射多个表。

Hibernate Envers对于历史数据来说是一个非常好的解决方案,但是你仍然无法做你尝试的事情(动态增加表的数量而不触及映射器实体)。

答案 3 :(得分:1)

感谢@CodeBrickie和@edutesoy,我找到了Envers。

我使用AUD后缀配置hibernate配置文件,每年创建新的hibernate配置文件(hibernate.cfg.2009.xml,hibernate.cfg.2010.xml,hibernate.cfg.2011.xml ...)年后缀。

保存数据时,始终在AUD表中进行审核。 1月1日,自动:

  • _AUD TABLE重命名为_PAST_YEAR表。
  • 创建一个新的_AUD表。
  • 使用新后缀创建一个新的hibernate.cfg.past_year.xml。

当我需要获取数据时,我会加载相应的hibernate配置文件。

希望这有助于其他人:)

答案 4 :(得分:1)

@Table(name="emd_employee_1001")

在上面的注释文件名中可以​​作为参数传递,例如

x=1001 
@Table(name="emd_employee_+x+")

答案 5 :(得分:0)

在运行时修改(我认为这是最好的方法):

Session session = super.getSession();
    SQLQuery query = session.createSQLQuery("raw sql");
    query.setParameter(":abc", "value");
    query.addEntity(Some.class);
    return query.list();