Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将列添加到JPA实体,并且仍然保留数据?_Jpa - Fatal编程技术网

如何将列添加到JPA实体,并且仍然保留数据?

如何将列添加到JPA实体,并且仍然保留数据?,jpa,Jpa,在开发JPA应用程序的过程中,我向实体添加了一个字段“type”。这导致应用程序无法启动 Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLSyntaxErrorException: Co

在开发JPA应用程序的过程中,我向实体添加了一个字段“type”。这导致应用程序无法启动

Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Column 'T1.TYPE' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE  statement then 'T1.TYPE' is not a column in the target table.
Error Code: -1
在选择过程中

有没有办法让它在启动时更改表,以匹配当前的实体定义? 我注意到,当应用程序启动时,它为每个表调用createtable,失败并继续

在过去,当我向实体添加字段时,我只是删除数据库并重新开始。现在这对我来说还可以,但是如果我在开发下一版本的软件时想在条目中添加一个字段,我如何升级我的客户机而不丢失所有这些数据呢


提前感谢-Phil。

一般来说,JPA提供商的数据库生成器在创建和更新生产数据库方面不可靠。假设在版本1中,您的
用户
实体有一个名为
名称
的字段,而在版本2中,您将其替换为
名字
姓氏
。在这种情况下,DB生成器无法正确迁移您的架构

换句话说,JPA提供程序的自动DB生成只对开发有用,而不用于生产

取而代之的是,您可以考虑使用像./P>这样的数据库迁移工具。


话虽如此,尽管EclipseLink不支持使用
EclipseLink.ddl generation
属性更新而不是重新创建表,但其他一些JPA提供商(如Hibernate)支持更新数据库表。但是,它们不能用于生产,因为它们在类似给定示例的情况下失败。

作为参考,如果您对DataNucleus执行了相同的操作,并为新字段(列)指定了默认值,并且您将相关的持久性属性设置为允许架构更新,则它将发出“ALTER TABLE ADD column…”很好。

您可以使用

“eclipselink.ddl生成”=“删除并创建表”

EclipseLink不支持更改现有表,请为此记录增强请求并投票支持


一般来说,让DBA定义一个脚本来定义生产模式和处理迁移通常是更好的

那很容易。持久化单元(persistence.xml)可以为您删除和创建表

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="JobbingPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>job</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

org.eclipse.persistence.jpa.PersistenceProvider
工作
假的

该属性是带有hibernate的“hibernate.hbm2ddl.auto”,其值可以是{validate | update | create | create drop}。同样,不建议用于生产目的。尽管在生产环境中,您的连接很可能没有进行此类更改的权限。EclipseLink 2.4支持一个新选项来更改现有表,“EclipseLink.ddl generation”=“create or extend tables”James,我们是否可以在生产中使用此新选项,或者@Behrang提到的可靠性是否仍然适用。即使如此,有些更改在没有人工干预的情况下是无法迁移的。因此,最好选择可靠的策略,而不是依赖于自动模式更新。在某些情况下,即使是差分也可能失败。像您提到的那样的更改是少数无法自动进行的更改之一;因为您的类不包含关于旧列和新列的信息。没有理由不在其他情况下使用自动生成功能。那么,在同一个应用程序中,当自动生成工作时,您使用自动生成功能,而当自动生成不工作时,您使用脚本、液化或类似的功能?对我来说,这听起来像一场维护噩梦。EclipseLink 2.4支持一个新选项来更改现有表,“EclipseLink.ddl生成”=“创建或扩展表”拖放并创建表是可以的,但是数据库中已经存储的数据呢?该选项仅用于开发,不用于升级现有表。。。它与JSF有什么关系?