0

首先,我需要说我不是 Hibernate 方面的专家。我只在其他项目中使用了它的基础知识。但是现在,我想在遗留数据库方案上使用 Hibernate,但是在将表映射到 Java 域模型时遇到了一些困难:

1)许多表都有一个由用户分配的主键(作为字符串)。所以它们不是根据某种算法生成的。它们实际上是 Hibernate 所说的“自然”键。有没有办法告诉 Hibernate 接受用户分配的 ID?

2) 第二个问题是很多表都有一些共同的属性,例如:valid_from、valid_to、date_created、date_last_modified、user_last_modified 和 user_created。这些属性用于审核(哪个记录由哪个用户更改)并在“valid_to”日期字段为过去时禁用记录。我不想将这些字段公开给最终用户,因为它们似乎是“元数据”,但我必须找到一种方法来更新这些字段。Hibernate 中是否有一个通用的解决方案,每当记录发生更改时,我可以使用它来更新这些字段?作为信息,这些字段也用于“链接表”,用于管理 2 个表之间的多对多关系。

非常感谢所有帮助!

更新:我将使用 AbstractEntity 来保存公共属性并使用 EventListener 插入/更新这些字段。UserContext.getCurrentUser() 将检索用户(用户将使用 ThreadLocal 绑定到当前线程)。

现在唯一的问题是如何处理那些“关联”表......它们还包含那些公共字段,我不想创建一个单独的类来映射这样的关联表。在我看来,Hibernate 在隐藏这样的链接表方面做得很好。我有办法用 EventListener 更新这样的链接表吗?

例如:如果表 A 通过链接表 A_B 与类 B 具有多对多关系,是否有办法在 A 或 B 上插入/更新记录时更新 A_B?

4

1 回答 1

1

我想您使用 JPA 注释来声明您的映射。

第一个问题。只是不要应用@GeneratedValue注释。

public class SomeEntityWithAutogeneratedId {
    @Id
    @GeneratedValue // autogeneration
    private Long id;
}

public class SomeEntityWithoutAutogeneratedId {
    @Id
    private String id;
}

第二个问题。您可以准备一个基类来简化公共字段的映射。然后,您可以@PrePersist在更新之前使用为所有必要字段应用正确的值:

public abstract class AbstractEntity {

    @Column
    private Date dateLastModified;

    @PrePersist
    public void beforePersist() {
        this.dateLastModified = new Date();
    }
}

public class Entity1 extends AbstractEntity {
public class Entity2 extends AbstractEntity {
public class Entity3 extends AbstractEntity {
...
public class EntityN extends AbstractEntity {

一般来说,如果您想通过 Hibernate 使用遗留数据库,最好在开始编写代码之前查看表结构/关系并进行适当的更改。这可以为您节省大量时间。例如,最好:

  • 用自动生成的唯一标识符替换复合键(请参阅官方文档中的此条目以获取解释)
  • 通过休眠功能或java代码删除/替换所有触发器或存储过程。如果您的所有逻辑都在应用程序代码中,那么使用缓存功能将很容易。
  • 我现在无法想象其他的东西,但是你可以有一个很长的列表,因为 SQL 数据库为你提供了更多无法通过 Hibernate 轻松使用的功能/功能
于 2013-08-09T11:22:55.027 回答