Java 跟踪更改的数据库设计-w/Hibernate
嘿,我在数据库设计方面遇到了困难。正如您可以从我当前的设计中看到的,注册可以有多个EmployeerRegistration,其中可以有多个ClientRegistration。从这里开始很简单。用户每年需要创建一个新的注册 不幸的是,我需要能够跟踪更改/修订。可以更改注册信息(姓名、地址等)或客户注册信息(删除/添加客户或删除/添加雇主) 我尝试了很多不同的设计,但到目前为止,没有一个感觉“正确”。跟踪注册表中的修改很容易,因为这会影响上面的所有表。所有id都已更新。是对ClientRegistration表的更改让我感到困惑。正如你所看到的,我有一个版本专栏,我一直在尝试,但它对我帮助不大。使用Hibernate,感觉每个修改后的客户端注册都需要自己独特的注册对象,但为任何客户端注册修改创建一个全新的注册似乎并不正确/高效 我已经为此奋斗了大约一个星期,所以任何帮助都将不胜感激。谢谢Java 跟踪更改的数据库设计-w/Hibernate,java,database,hibernate,database-design,nhibernate-mapping,Java,Database,Hibernate,Database Design,Nhibernate Mapping,嘿,我在数据库设计方面遇到了困难。正如您可以从我当前的设计中看到的,注册可以有多个EmployeerRegistration,其中可以有多个ClientRegistration。从这里开始很简单。用户每年需要创建一个新的注册 不幸的是,我需要能够跟踪更改/修订。可以更改注册信息(姓名、地址等)或客户注册信息(删除/添加客户或删除/添加雇主) 我尝试了很多不同的设计,但到目前为止,没有一个感觉“正确”。跟踪注册表中的修改很容易,因为这会影响上面的所有表。所有id都已更新。是对ClientRegis
您可以使用Envers,它现在捆绑在hibernate核心中 您可以使用Envers,它现在捆绑在hibernate核心中 你退房了吗?它是一个用于Hibernate的自动版本控制插件。使跟踪对象更改的历史记录变得非常容易。它是以AOP方式配置的,因此您可以简单地对要审核的对象进行注释,并让Envers处理细节:
@Entity
@Audited
public class Person {
@Id
@GeneratedValue
private int id;
private String name;
private String surname;
@ManyToOne
private Address address;
...
}
你退房了吗?它是一个用于Hibernate的自动版本控制插件。使跟踪对象更改的历史记录变得非常容易。它是以AOP方式配置的,因此您可以简单地对要审核的对象进行注释,并让Envers处理细节:
@Entity
@Audited
public class Person {
@Id
@GeneratedValue
private int id;
private String name;
private String surname;
@ManyToOne
private Address address;
...
}
你有没有接触过时态数据建模的概念?你可能想用谷歌搜索一下。一种非常流行的时态建模技术是“有效日期”逻辑,在Peoplesoft中广泛使用。简而言之,它是这样的:
PrimaryKey1 2012-01-01 1 MyData1 MyData2
PrimaryKey1 2012-02-01 1 MyData1 Change1
PrimaryKey1 2012-02-01 2 Change2 Change1
select * from MyTable A
where effdt = (select max(effdt) from MyTable where PrimaryKey = A.PrimaryKey)
and effseq = (select max(effseq) from MyTable where PrimaryKey = A.PrimaryKey
and Effdt=A.EFfdt)
系统中的每个表都有此设计模式:
Table{
Primary_key,
effdt,
effseq,
other data,
modified_ts
};
使用主键effdt和effseq“堆叠”记录的多个版本。Effdt仅存储日期,不存储日期时间。effseq(int)用于在同一天存储多个更改。修改后的\u ts存储数据更改的日期戳
表中的数据如下所示:
PrimaryKey1 2012-01-01 1 MyData1 MyData2
PrimaryKey1 2012-02-01 1 MyData1 Change1
PrimaryKey1 2012-02-01 2 Change2 Change1
select * from MyTable A
where effdt = (select max(effdt) from MyTable where PrimaryKey = A.PrimaryKey)
and effseq = (select max(effseq) from MyTable where PrimaryKey = A.PrimaryKey
and Effdt=A.EFfdt)
要从任何表中获取最新数据,可以使用如下查询:
PrimaryKey1 2012-01-01 1 MyData1 MyData2
PrimaryKey1 2012-02-01 1 MyData1 Change1
PrimaryKey1 2012-02-01 2 Change2 Change1
select * from MyTable A
where effdt = (select max(effdt) from MyTable where PrimaryKey = A.PrimaryKey)
and effseq = (select max(effseq) from MyTable where PrimaryKey = A.PrimaryKey
and Effdt=A.EFfdt)
这会有帮助吗?您是否了解了时态数据建模的概念?你可能想用谷歌搜索一下。一种非常流行的时态建模技术是“有效日期”逻辑,在Peoplesoft中广泛使用。简而言之,它是这样的:
PrimaryKey1 2012-01-01 1 MyData1 MyData2
PrimaryKey1 2012-02-01 1 MyData1 Change1
PrimaryKey1 2012-02-01 2 Change2 Change1
select * from MyTable A
where effdt = (select max(effdt) from MyTable where PrimaryKey = A.PrimaryKey)
and effseq = (select max(effseq) from MyTable where PrimaryKey = A.PrimaryKey
and Effdt=A.EFfdt)
系统中的每个表都有此设计模式:
Table{
Primary_key,
effdt,
effseq,
other data,
modified_ts
};
使用主键effdt和effseq“堆叠”记录的多个版本。Effdt仅存储日期,不存储日期时间。effseq(int)用于在同一天存储多个更改。修改后的\u ts存储数据更改的日期戳
表中的数据如下所示:
PrimaryKey1 2012-01-01 1 MyData1 MyData2
PrimaryKey1 2012-02-01 1 MyData1 Change1
PrimaryKey1 2012-02-01 2 Change2 Change1
select * from MyTable A
where effdt = (select max(effdt) from MyTable where PrimaryKey = A.PrimaryKey)
and effseq = (select max(effseq) from MyTable where PrimaryKey = A.PrimaryKey
and Effdt=A.EFfdt)
要从任何表中获取最新数据,可以使用如下查询:
PrimaryKey1 2012-01-01 1 MyData1 MyData2
PrimaryKey1 2012-02-01 1 MyData1 Change1
PrimaryKey1 2012-02-01 2 Change2 Change1
select * from MyTable A
where effdt = (select max(effdt) from MyTable where PrimaryKey = A.PrimaryKey)
and effseq = (select max(effseq) from MyTable where PrimaryKey = A.PrimaryKey
and Effdt=A.EFfdt)
那会有帮助吗?我觉得现在是圣诞节,我很开心。Hibernate继续让我大吃一惊。是的,当我遇到这个图书馆的时候我也有同样的感觉。我觉得现在是圣诞节,我很开心。Hibernate继续让我大吃一惊。是的,我遇到这个图书馆的时候也有同样的感觉。