以下情况:
我正在使用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。
答案 0 :(得分:0)
据我所知,您不打算将List(Child)保存到备份表中,这意味着您不必将字段作为DB列包含在字段中。
对于您遇到的一般问题,可能可以使用DB端解决方案而不是服务器端解决方案来解决它。 你检查过DB触发器吗?和DB日期列具有默认值/自动生成的值?
答案 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>
希望有所帮助