Java Hibernate ORM在持久化临时实体后在刷新时生成不需要的SQL更新

Java Hibernate ORM在持久化临时实体后在刷新时生成不需要的SQL更新,java,sql,hibernate,orm,Java,Sql,Hibernate,Orm,我有JPA注释映射的父子实体: 我创建父实体的新实例,添加一些字段,并从JPA提供者调用persist方法。我得到了不需要的sql更新。 为什么冬眠会产生它 Hibernate: insert into field_type (id) values (?) Hibernate: insert into template (id, client_id, name) values (default, ?, ?) Hibernate: select template_f_.id from field_

我有JPA注释映射的父子实体:

我创建父实体的新实例,添加一些字段,并从JPA提供者调用persist方法。我得到了不需要的sql更新。 为什么冬眠会产生它

Hibernate: insert into field_type (id) values (?)
Hibernate: insert into template (id, client_id, name) values (default, ?, ?)
Hibernate: select template_f_.id from field_type template_f_ where template_f_.id=?
Hibernate: insert into field (id, field_name_id, operation_template_id, field_value) values (default, ?, ?, ?)
(!)  Hibernate: update field set operation_template_id=? where id=?
带有子类的类模板:

package.com.example;
导入javax.persistence.*;
导入javax.persistence.CascadeType;
导入javax.persistence.Entity;
导入javax.persistence.Table;
导入java.util.*;
@实体
@表(name=“TEMPLATE”)
公共类模板{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“ID”)
私人长id;
@列(name=“CLIENT\u ID”,updateable=false)
私人长客户;
@列(name=“name”)
私有字符串名称;
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
@JoinColumn(name=“OPERATION\u TEMPLATE\u ID”,referencedColumnName=“ID”)
私有集字段=新HashSet();
//接球手和接球手
@实体(名称=“字段”)
@表(name=“FIELD”)
公共静态类字段{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“ID”)
私人长id;
@OneToOne(fetch=FetchType.LAZY,可选=false)
@JoinColumn(name=“FIELD\u name\u ID”,null=false)
私有字段类型名称;
@manytone(fetch=FetchType.LAZY,可选=false)
@JoinColumn(name=“OPERATION\u TEMPLATE\u ID”,nullable=false)
私有模板;
@列(name=“FIELD\u VALUE”,null=false)
私有字符串值;
//接球手和接球手
}
@实体
@表(name=“字段类型”)
公共静态类FieldType{
@身份证
@列(name=“ID”)
私人长id;
@列(name=“TYPE\u name”,insertable=false,updateable=false)
私有字符串名称;
//接球手和接球手
}
}
道类

@存储库
公共类FieldTypeDao{
@持久上下文
受保护的实体管理器实体管理器;
@交易的
public void saveAsNew(Template.FieldType FieldType){
entityManager.persist(字段类型);
entityManager.flush();
}
}
@存储库
公共类模板dao{
@持久上下文
受保护的实体管理器实体管理器;
@交易的
公共void saveAsNew(模板){
entityManager.persist(模板);
entityManager.flush();
}
}
配置和主类

package.com.example;
导入org.springframework.boot.SpringApplication;
导入org.springframework.boot.autoconfigure.springboot应用程序;
@SpringBoot应用程序
公共类脱应用{
公共静态void main(字符串[]args){
run(DemoHbnApplication.class,args);
}
}
测试:

package.com.example;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.boot.test.SpringApplicationConfiguration;
导入org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes=DemoHbnApplication.class)
公共类模板测试{
@自动连线
私有TemplateDao TemplateDao;
@自动连线
私有FieldTypeDao FieldTypeDao;
@试验
public void testSave()引发异常{
模板模板=新模板();
模板.setName(“测试模板名称”);
Template.Field=new Template.Field();
Template.FieldType FieldType=新建Template.FieldType();
fieldType.setId(1L);
fieldType.setName(“示例类型”);
fieldTypeDao.saveAsNew(fieldType);
field.setName(fieldType);
字段设置值(“123”);
field.setTemplate(模板);
template.getFields().add(字段);
templateDao.saveAsNew(模板);
}
}
带有
logging.level.org.hibernate:TRACE的部分测试输出

2016-02-15 11:30:03.686调试8596---[main]org.hibernate.SQL:插入字段(id、字段名称、操作模板id、字段值)值(默认值、、、?)
Hibernate:插入字段(id、字段名称、操作模板、字段值)值(默认值、、、)
2016-02-15 11:30:03.687 TRACE 8596---[main]o.h.e.jdbc.internal.jdbcoordinatorimpl:注册声明[org.hsqldb.jdbc。JDBCPreparedStatement@6dc9da2d[sql=[插入字段(id、字段名称、操作模板id、字段值)值(默认值、、?、?)],参数=[[null]、[null]、[null]]]
2016-02-15 11:30:03.687 TRACE 8596---[main]o.h.p.entity.AbstractEntityPersister:脱水实体:[com.example.Template$Field#]
2016-02-15 11:30:03.687 TRACE 8596---[main]o.hibernate.engine.spi.IdentifierValue:ID未保存的值策略未定义
2016-02-15 11:30:03.687 TRACE 8596---[main]o.h.type.descriptor.sql.BasicBinder:绑定参数[1]为[BIGINT]-[1]
2016-02-15 11:30:03.687 TRACE 8596---[main]o.h.type.descriptor.sql.BasicBinder:绑定参数[2]为[BIGINT]-[1]
2016-02-15 11:30:03.687 TRACE 8596---[main]o.h.type.descriptor.sql.BasicBinder:绑定参数[3]为[VARCHAR]-[123]
2016-02-15 11:30:03.688调试8596---[main]o.h.id.IdentifierGeneratorHelper:本机生成的标识:1
2016-02-15 11:30:03.688 TRACE 8596---[main]o.h.e.jdbc.internal.jdbcoordinatorimpl:发布结果集[org.hsqldb.jdbc]。JDBCResultSet@1d408060]
2016-02-15 11:30:03.688 TRACE 8596---[main]o.h.e.jdbc.internal.jdbcoordinatorimpl:关闭结果集[org.hsqldb.jdbc]。JDBCResultSet@1d408060]
2016-02-15 11:30:03.688 TRACE 8596---[main]o.h.e.jdbc.internal.jdbcoordinatorimpl:发布声明[org.hsqldb.jdbc。JDBCPreparedStatement@6dc9da2d[sql=[插入到字段中(id,fi