我有一个与表关联的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类是相同的,更改表名和构造函数。
答案 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日,自动:
当我需要获取数据时,我会加载相应的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();