繁体   English   中英

如何使用Hibernate在MySQL DB中创建特定表

[英]How to create specific table in MySQL DB using Hibernate

所以以下情况:

我正在使用Hibernate将数据上传到数据库或从数据库下载数据,效果很好。

目前,我有两个表,“父母”(是父母)和“孩子”(是孩子)。 我有一个OneToMany / ManyToOne关系。 我只上传父级,子级由于级联而自动上传。 Parent.class有一个List(Child)。

如果更改或更新了“父代”的实体,我想将“旧版本”移动到名为“ Parent_OLD”的表中(当然,该子代也通过级联),并向旧实体添加时间戳。

因此,我当前遇到的问题是:我试图通过创建一个新类“ Parent_OLD”来解决该问题,该类看起来与“父类”完全相同,除了时间戳。 所以我要做的是:每当我将新数据上传到DB时,我都会检查该实体是否已经存在,如果存在,我将通过“获取器”将数据传递给“ Parent_OLD”。 到目前为止,这种方法还不错,因为我只需要传递3个属性,但是如果我要添加更多字段,那么对此有一个不同的解决方案将很方便。

但是不起作用的是将“ child_OLD”移到“ Child_OLD”。 因此,如上所述,Parent.class具有一个List(Child)。 实际上,Child_NEW和Child_OLD看起来完全一样,因为它们不需要时间戳。 但是由于在Child.class之上的休眠注释,Child.class的每个实体都被加载到“ Child”表中。

所以我创建了一个Child_OLD.class。 这意味着:我有一个当前的Parent实体,带有一个List(Child)。 我想将父项(包括列表)传递给Parent_OLD实体。

但是我不能将List(Child)强制转换为List(Child_OLD)。 我尝试过将其转换为对象列表,然后转换为Child_OLD,但这没有用。 通过“ getters”传递属性是没有选择的,因为该类有60个字段。 我也尝试创建一个抽象类“ Child”,但仍然无法使其正常工作。

所以我认为,如果我可以告诉Hibernate将某些实体加载到另一个表中,那将非常简单。 因此,可能类似于CheckIfExistsAndIfItDoesCopyToOldTable-Method上方的注释。 这可能吗? 还是有人知道我能解决我的问题吗?

我想我要道歉,因为我不知道我能清楚地解释自己的问题。 非常抱歉给您带来混乱的文字,并感谢您的想法!

编辑:我想备份父级以及子级。 但这应尽可能通过级联发生。 因此,通过备份父级,带有子级的列表应移到“子级备份表”中。

据我了解,您不打算将List(Child)保存到备份表中,这意味着您不必将字段包括为数据库列。

对于一般问题,您可能可以使用数据库端解决方案来解决,而不是服务器端解决方案。.您是否检查过数据库触发器? 和数据库日期列具有默认值/自动生成的值?

MySQL触发器将行插入另一个表

Hibernate支持Table Per Concrete类

正如您提到的那样,您将需要使用仅添加时间戳的相同数据“克隆”表。

您可以尝试以下方法:

@Entity
@Table(name = "child")
class Child
    // variables ..

@Entity
@Table(name = "child_history")
class Child_OLD extends Child
    // adding time stamp variable

@Entity
@Table(name = "parent")
class Parent
    // variables ..
    List<Child> ..

@Entity
@Table(name = "parent_history")
class Parent_OLD extends Parent
    // adding time stamp variable

2个子类Child_OLD和Parent_OLD将几乎为空。.您必须实现基本的Child和Parent类,并且在子类(Child_OLD和Parent_OLD)中,您将必须创建一个克隆构造函数。

克隆构造函数将必须对对象进行深层复制 (也用于List。)

为了使Java中的日期/时间戳操作最少,您可以使用mysql内置功能,该功能在插入/更新时提供默认值,这样可以节省时间,而无需在Java中管理日期变量,如下所示:

/* managed by DB column definition */
@Column(
        name = "SYS_CREATION_DATE",
        insertable=false,
        updatable=false,
        columnDefinition="DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
        )
private Date sysCreationDate;

我使用的pom.xml依赖项(不确定是否相关)

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.5</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>1.5.7.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.2.11.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.11.Final</version>
</dependency>

希望能帮助到你

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM