【问题标题】:How to represent a legacy database using Hibernate?如何使用 Hibernate 表示遗留数据库?
【发布时间】:2013-05-14 16:33:03
【问题描述】:

我有以下遗留数据库结构和内容:

order parameter        value
--------------------------------
1     user_login       user
1     user_password    123456
1     user_level       basic
2     user_login       admin
2     user_password    s3k42k
2     user_level       advanced

我想将其表示如下并利用一个名为“用户”的实体,以便我可以抽象出遗留结构的复杂性:

id    user  password  level
-------------------------------
1     user  123456    basic
2     admin s3k42k    advanced

我使用数据库中的视图来做到这一点,但我无法使用此视图进行更新。有没有办法使用 Hibernate 来表示遗留结构,以便我也可以更新?

【问题讨论】:

  • 我不认为 Hibernate 可以做到这一点。从长远来看,相反的做法可能会更容易;规范化表并创建一个复制旧代码的键值表示的视图。

标签: java hibernate view legacy-database data-representation


【解决方案1】:

您最好的方法可能是规范化表格。从长远来看,这将使事情变得容易得多。您可以尝试的一件事这不是一个选项,是创建另一个名为 user 的表,该表至少包含一个主键和参数表中用户信息的 id。这将允许您将关系视为一对多并将其映射到休眠状态。例如,您可以执行以下操作:

注意我可能有错误的映射我只是为了说明这一点而做了这个。

@Entity
class Parameter{

    @Column(name="order")
    private int order;

    @column(name="parameter")
    private String parameter;

    @column(name="value")
    private String value;

} 

@Entity
class User{

    @column(name="id")
    private int id;

    @OneToMany(cascade=ALL)
    @JoinTable(name="SECONDARY", 
        joinColumns={@JoinColumn(name="id")},
        inverseJoinColumns=@JoinColumn(name="order"))
    @MapKeyJoinColumn(name="parameter")
    private Map<String,Parameter> userData;

    public String getUserName(){
        return userdata.get("user_login")
    }

    etc.

}

【讨论】:

  • 这很有用,但我可以通过实体 User 更新旧表?
  • 将级联类型设置为 all 应该在持久化、合并和删除时执行此操作。只需通过用户对象保存所有内容(并对其进行测试以确保)。如果可以的话,随着时间的推移对表格进行规范化会更有效率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2012-05-02
  • 2011-01-17
相关资源
最近更新 更多