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

时间:2017-11-13 10:01:24

标签: java mysql hibernate jpa

以下情况:

我正在使用Hibernate从数据库上传/下载数据,这很好。

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

如果是" Parent"的实体更改/更新,我想移动"旧版本"到一个名为" Parent_OLD"的表中(当然还有孩子通过级联)并为旧实体添加时间戳。

所以我目前遇到的问题是: 我试图通过创建一个新类来解决它" Parent_OLD"看起来和'#34;父母"完全一样除了时间戳。 所以我做的是:每当我将新数据上传到数据库时,我都会检查实体是否已经存在,如果确实存在,我会通过" getters"到" Parent_OLD"。到目前为止这个工作正常,因为我只需要传递3个属性,但如果我最终得到更多的字段,那么对它有一个不同的解决方案会很方便。

但是不起作用的是移动" child_OLD"到了#34; Child_OLD"。 如上所述,Parent.class有一个List(Child)。 Child_NEW和Child_OLD实际上看起来完全相同,因为它们不需要时间戳。但由于Child.class上的Hibernate Annotation,Child.class的每个实体都被加载到" Child" -table。

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

但是我无法将List(Child)强制转换为List(Child_OLD)。我已经尝试将其转换为对象列表,然后转换为Child_OLD,但这不起作用。 通过" getters"传递属性没有选择,因为班级有60个字段。 我还尝试创建一个抽象类" Child"但我仍然无法让它发挥作用。

所以我认为如果我能告诉Hibernate将某些实体加载到另一个表中会非常简单。也许类似于CheckIfExistsAndIfItDoesCopyToOldTable-Method上方的注释。这可能吗? 或者有谁知道如何解决我的问题?

我想我需要道歉,因为我不知道我有多清楚地设法解释我的问题。 对于可能令人困惑的文本感到抱歉,并提前感谢您的想法!

编辑: 我想备份Parent和Child。 但如果可能的话,这应该通过级联发生。 因此,通过备份Parent,将带有子项的List移动​​到Child-BackUp-Table。

2 个答案:

答案 0 :(得分:0)

据我所知,您不打算将List(Child)保存到备份表中,这意味着您不必将字段作为DB列包含在字段中。

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

MySQL trigger to insert row into another table

答案 1 :(得分:0)

Hibernate支持Table Per Concrete class

如你所说,你将需要克隆"具有相同数据的表只添加时间戳。

你可以试试这个:

@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>

希望有所帮助