【问题标题】:Ignore some Entities while generating creation scripts生成创建脚本时忽略一些实体
【发布时间】:2013-05-02 12:27:01
【问题描述】:

假设我们有一堆实体类,它们在每个人之间都有映射:

@Entity
@Table(name = "legacy")
public class Legacy {
    // Mappings to a bunch of other different Entities
}

@Entity
@Table(name = "new_entity")
public class NewEntity {

    private Legacy legacy;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "legacy_id", referencedColumnName = "id")
    public Legacy getLegacy() {
        return legacy;
    }

    public Legacy setLegacy(Legacy legacy) {
        this.legacy = legacy;
    }

    // Mappings to other new stuff
}

我们可以使用hibernate中的Configuration类来为一些带注释的类生成创建脚本:

Configuration config = new Configuration();

Properties properties = new Properties();
properties.put("hibernate.dialect", "org.hibernate.dialect.SQLServer2005Dialect");
config.setProperties(properties);

config.addAnnotatedClass(NewEntity.class)

String[] schema = 
        config.generateSchemaCreationScript(new SQLServer2005Dialect());
for (String table : schema) {
    System.out.println(table);
}

这将失败,因为类Legacy 尚未添加到配置中。但是,如果我这样做,我需要添加一堆其他遗留类(它们都已经有“工作”映射和表。

有没有办法只为NewEntity 生成脚本而不必为Legacy 添加所有映射?现在我通过注释 Legacy 映射为 NewEntity 生成脚本,然后手动将它们添加回来。

【问题讨论】:

    标签: java sql hibernate hibernate-mapping


    【解决方案1】:

    如果您的 NewEntity 引用并与映射关系中的 Legacy 对象交互,您需要映射它。

    如果它们尚未映射,那么休眠操作如何工作?

    如果您的意思是想要一个现有架构的更新脚本而不是生成新的创建数据库脚本,请尝试generateSchemaUpdateScript 方法。

    【讨论】:

    • 我的Legacy 实体已经被映射,不需要对其架构进行任何更改。 NewEntity 还没有表,我希望脚本创建它(以及映射Legacy 实体的列)。 generateSchemaUpdateScript 提供这个吗?是否需要连接到数据库才能正常工作?
    • 是的,它应该返回创建语句。或者如果架构有任何更新,则更新语句。
    • 太棒了!我想我可以以某种方式从 Spring 中提取带注释的类,这样我就不必手动添加它们了 :)
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多