Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跟踪更改的数据库设计-w/Hibernate_Java_Database_Hibernate_Database Design_Nhibernate Mapping - Fatal编程技术网

Java 跟踪更改的数据库设计-w/Hibernate

Java 跟踪更改的数据库设计-w/Hibernate,java,database,hibernate,database-design,nhibernate-mapping,Java,Database,Hibernate,Database Design,Nhibernate Mapping,嘿,我在数据库设计方面遇到了困难。正如您可以从我当前的设计中看到的,注册可以有多个EmployeerRegistration,其中可以有多个ClientRegistration。从这里开始很简单。用户每年需要创建一个新的注册 不幸的是,我需要能够跟踪更改/修订。可以更改注册信息(姓名、地址等)或客户注册信息(删除/添加客户或删除/添加雇主) 我尝试了很多不同的设计,但到目前为止,没有一个感觉“正确”。跟踪注册表中的修改很容易,因为这会影响上面的所有表。所有id都已更新。是对ClientRegis

嘿,我在数据库设计方面遇到了困难。正如您可以从我当前的设计中看到的,注册可以有多个EmployeerRegistration,其中可以有多个ClientRegistration。从这里开始很简单。用户每年需要创建一个新的注册

不幸的是,我需要能够跟踪更改/修订。可以更改注册信息(姓名、地址等)或客户注册信息(删除/添加客户或删除/添加雇主)

我尝试了很多不同的设计,但到目前为止,没有一个感觉“正确”。跟踪注册表中的修改很容易,因为这会影响上面的所有表。所有id都已更新。是对ClientRegistration表的更改让我感到困惑。正如你所看到的,我有一个版本专栏,我一直在尝试,但它对我帮助不大。使用Hibernate,感觉每个修改后的客户端注册都需要自己独特的注册对象,但为任何客户端注册修改创建一个全新的注册似乎并不正确/高效

我已经为此奋斗了大约一个星期,所以任何帮助都将不胜感激。谢谢


您可以使用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继续让我大吃一惊。是的,我遇到这个图书馆的时候也有同样的感觉。