2010-05-24 15 views
2

有没有办法使用相同的实体类将旧表中的表项转换为新表?如何转换略有不同的表?

要specfic,这里有我的实​​体类的注解为新表:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "benutzer_id") 
private Integer benutzerId; 
@Basic(optional = false) 
@Column(name = "benutzer_name") 
private String benutzerName; 
@Column(name = "benutzer_vorname") 
private String benutzerVorname; 
@Column(name = "benutzer_nachname") 
private String benutzerNachname; 
@JoinColumn(name = "gruppe_id", referencedColumnName = "gruppe_id") 
@ManyToOne(optional = false) 
private Gruppe gruppe; 
@OneToMany(mappedBy = "benutzer") 
private Collection<Bestellung> bestellungen; 

列‘benutzer_vorname’和‘benutzer_nachname’在旧表丢失,所以Hibernate的崩溃,如果它试图映射表条目。

我必须创建一个新的实体类,还是可以使用现有的类来转换数据?

+0

但是...旧桌子会留下来吗?你需要使用JPA进行“转换”吗? – 2010-05-24 19:28:47

+0

不,它不会留下来。我更喜欢使用JPA,因为它更容易编码。 – punischdude 2010-05-24 19:33:10

+0

使用JPA很好......但不适合这项任务。为什么不使用原始的sQL脚本将数据从旧表迁移到新表?这将是这项工作的最佳工具。我错过了什么吗? – 2010-05-24 19:41:57

回答

1

我必须创建一个新的实体类,还是可以使用现有的类来转换数据?

你不能在两个表上映射一个实体(我不是在说这里的JOIN继承策略),所以你必须创建一个新的实体。

1

如果您正在考虑如何从一个表结构迁移到另一个表结构,那么Hibernate可能不是最好的解决方案。

如果表是平的(无关联),那么使用SQL复制条目可能非常简单。您可以选择所需的数据并将其直接插入到新表中(语法可能因DBMS而异,但这可能会对您造成影响)。

在标准SQL中,你可以做如下

INSERT INTO new_table (
    column1, 
    column2, 
    column3 
) 
SELECT 
    column1 as "Copied value for new entity", 
    'a default' as "Default value for new entity", 
    some_column * 3 as "Computed Value for new entity" 
FROM 
    new_table; 

选择列的别名是可选的,当然,我只是把他们当作你可以做各种事情的意见。

当然,如果你有一个更复杂的表格结构,你想扁平化,只要它返回你想插入的一组行就可以执行任何复杂的查询。

+0

问题是我为了测试目的需要“迁移”很多次。 – punischdude 2010-05-24 19:42:17

+0

您可以让hibernate通过您配置的数据源来运行SQL。只需使用'session.createSQLQuery(“SELECT ...”).list();'代替。 – Geoff 2010-05-24 19:48:41

相关问题