gpt4 book ai didi

java - Spring 与 Hibernate 和 JPA 集成 - 一张表不是在启动时创建的,其他表是在启动时创建的

转载 作者:行者123 更新时间:2023-12-01 11:08:12 28 4
gpt4 key购买 nike

我正在尝试向现有的 Spring 应用程序添加两个额外的表。一个正在数据库中创建,但另一个尚未创建。我看不到 JPA 对象有任何明显的差异,并且我已经更新了两者的数据库属性。这些表之间唯一的主要区别是,一个以双向关系映射到用户表,另一个只是单向关系。

以下是一些代码示例:

持久性.xml:

<persistence-unit name="samplePersistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.bpc.services.domain.objects.User</class>
<class>com.bpc.services.domain.objects.Account</class>
<class>com.bpc.services.domain.objects.Transaction</class>
<class>com.bpc.services.domain.objects.Payment</class>
<class>com.bpc.services.domain.objects.Product</class>
<properties>
<!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database -->
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
<property name="hbm2ddl.auto" value="update"/>
<property name="show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
</properties>

data-context.xml JPA 声明:

<jpa:repositories base-package="com.bpc.services.domain.repositories" />

产品实体:

@Entity
@Table(name = "product")
public class Product extends BaseEntity {

支付实体:

@Entity
@Table(name = "payment")
public class Payment extends BaseEntity {
@ManyToOne
User user;

用户实体:

@Entity
@Table(name="rest_user")
public class User extends BaseEntity {
@OneToMany(mappedBy="user",
targetEntity=Payment.class,
cascade= CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private List<Payment> payments = new ArrayList<Payment>();

帐户实体:

@Entity
@Table(name = "rest_account")
public class Account extends BaseEntity {
@ManyToOne
private Product appliedProduct;

产品表已创建,并以 *:1 关系链接到帐户对象。但我的付款表丢失了。部署运行正常,日志中显示以下内容:

[localhost-startStop-1] DEBUG org.hibernate.cfg.Ejb3Column - Binding column: Ejb3Column{table=org.hibernate.mapping.Table(payment), mappingColumn=id, insertable=true, updatable=true, unique=false}

因此应用程序知道付款域对象并在部署中使用它,但是当我尝试通过客户端使用我的服务时,日志显示以下内容:

DEBUG o.h.e.jdbc.spi.SqlExceptionHelper - could not extract ResultSet [n/a] com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'services.payment' doesn't exist

[http-bio-8080-exec-3] WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1146, SQLState: 42S02

[http-bio-8080-exec-3] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Table 'services.payment' doesn't exist

<小时/>

更新我尝试使用“创建”而不是“更新”(如答案中的建议)运行,但遇到了同样的问题。现在有一个与付款表相关的附加日志条目:

11:37:14.994 [localhost-startStop-1] DEBUG o.s.j.d.LazyConnectionDataSourceProxy - Connecting to database for operation 'createStatement'

11:37:14.999 [localhost-startStop-1] DEBUG org.hibernate.SQL - alter table payment drop foreign key FK_5b79940uennr1ffusdus7cp2r

11:37:15.012 [localhost-startStop-1] ERROR o.h.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: alter table payment drop foreign key FK_5b79940uennr1ffusdus7cp2r

11:37:15.012 [localhost-startStop-1] ERROR o.h.tool.hbm2ddl.SchemaExport - Table 'services.payment' doesn't exist

11:37:15.012 [localhost-startStop-1] DEBUG org.hibernate.SQL - alter table rest_account drop foreign key FK_ek67yy1rmivvpoofrc0603du9

11:37:15.513 [localhost-startStop-1] DEBUG org.hibernate.SQL - alter table rest_verification_token drop foreign key FK_9i1lxa0i6h09fcobtm570hq7u

11:37:16.000 [localhost-startStop-1] DEBUG org.hibernate.SQL - alter table transactions drop foreign key FK_8i8qo3qvlyg4xaiqgrnbpfvvh

11:37:16.498 [localhost-startStop-1] DEBUG org.hibernate.SQL - alter table transactions drop foreign key FK_ce9ag0mlblwcp5n1bi1f2xwgs

11:37:16.993 [localhost-startStop-1] DEBUG org.hibernate.SQL - drop table if exists payment

加载支付存储库时(无任何异常(exception)),这会显示在日志中:

Identity insert: insert into payment (time_created, uuid, version, description, in, out, performed_by, user, user_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)

11:37:14.919 [localhost-startStop-1] DEBUG o.h.l.p.b.i.spaces.QuerySpacesImpl - Adding QuerySpace : uid = -> org.hibernate.loader.plan.build.internal.spaces.EntityQuerySpaceImpl@b90c767]

11:37:14.923 [localhost-startStop-1] DEBUG o.h.p.w.spi.MetamodelGraphWalker - Visiting attribute path : timeCreated

11:37:14.923 [localhost-startStop-1] DEBUG o.h.p.w.spi.MetamodelGraphWalker - Visiting attribute path : uuid

11:37:14.923 [localhost-startStop-1] DEBUG o.h.p.w.spi.MetamodelGraphWalker - Visiting attribute path : version

11:37:14.923 [localhost-startStop-1] DEBUG o.h.p.w.spi.MetamodelGraphWalker - Visiting attribute path : description

11:37:14.923 [localhost-startStop-1] DEBUG o.h.p.w.spi.MetamodelGraphWalker - Visiting attribute path : in

11:37:14.923 [localhost-startStop-1] DEBUG o.h.p.w.spi.MetamodelGraphWalker - Visiting attribute path : out

11:37:14.923 [localhost-startStop-1] DEBUG o.h.p.w.spi.MetamodelGraphWalker - Visiting attribute path : performedBy

11:37:14.923 [localhost-startStop-1] DEBUG o.h.p.w.spi.MetamodelGraphWalker - Visiting attribute path : user

11:37:14.923 [localhost-startStop-1] DEBUG o.h.l.p.b.i.spaces.QuerySpacesImpl - Adding QuerySpace : uid = -> org.hibernate.loader.plan.build.internal.spaces.EntityQuerySpaceImpl@74febc11]

最佳答案

你试过吗<property name="hibernate.hbm2ddl.auto" value="create"/>而不是update ?请注意create正在破坏之前的数据!请参阅:doc了解详情。

关于java - Spring 与 Hibernate 和 JPA 集成 - 一张表不是在启动时创建的,其他表是在启动时创建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32693841/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com