почему Spring-data-jpa не сохранил объект подкласса? - PullRequest
0 голосов
/ 23 декабря 2018

Причиной этой проблемы является конфигурация.Hibernate имеет конфигурацию: hibernate.default_batch_fetch_size, поэтому я просто добавил его в application.properties как: spring.jpa.properties.hibernate.jdbc.batch_size (неверно), однако вы не можете найти его в приложении A.Общие свойства приложения.Это работает для меня, удалив это свойство.

наконец, почему Springboot не выдал исключение, если он не может понять это свойство?Почему это свойство ошибки может помешать совершению транзакции?

update2 hibernate sql log Update1 код пользователя и классов учеников.

Кстати, это был старый проект, который отлично работал с весны 5.0.4 и JPA2.1 (Hibernate 5.2.14).Я изучаю и пытаюсь перенести этот проект в springboot и spring-data-jpa.

У меня была очень очень странная проблема.Когда я пытаюсь сохранить объект подкласса в базе данных, пружинные данные jpa могут только сохранить свойства суперкласса в таблице суперкласса, но ничего в таблице подклассов.И если сохраняются два объекта подкласса одновременно, первый объект может быть сохранен в таблицу подклассов, но второй будет игнорироваться.Тем не менее, оператор вставки sql, кажется, выполняется (по крайней мере, это показано в консоли).

spring-boot-starter-data-jpa 2.1.0

суперкласс

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String name;
    @Column(unique = true)
    private String number;
    @JsonIgnore
    private String password;
    @ManyToOne
    private Authority authority;
    @Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private LocalDateTime insertTime;
    }

подкласс

@Entity
@Data
public class Student extends User{
    private String clazz;
    @OneToMany(mappedBy = "student")
    @OrderBy(value ="id ASC")
    private Set<CourseDetail> courseDetails;
    @OneToMany(mappedBy = "student")
    @OrderBy(value ="id ASC")
    private Set<ExperimentDetail> experimentDetails;
}

StudentRepository

@Repository
    public interface StudentRepository extends JpaRepository<Student, Long> {}

Сервис

@Service
@Transactional
@Slf4j
public class TestService {
    @Autowired
    private StudentRepository studentRep;
    public void addStudentTest() {
        Student s = new Student();
        s.setName("1");
        s.setClazz("1");
        studentRep.save(s);

        Student s1 = new Student();
        s1.setName("2");
        s1.setClazz("2");
        studentRep.save(s1);
        // int a = 1 / 0;
           log.debug(String.valueOf(TransactionSynchronizationManager.getCurrentTransactionName()));
}
}

Тест

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class AddUserTest {
    @Autowired
    private TestService testService;
    @Test
    public void addStudentTest() {
        testService.addStudentTest();

    }
}

application.properties

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/coursetest?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf-8
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

Консоль

Hibernate: insert into user (authority_id, insert_time, name, number, password) values (?, ?, ?, ?, ?)
Hibernate: insert into student (clazz, id) values (?, ?)
Hibernate: insert into user (authority_id, insert_time, name, number, password) values (?, ?, ?, ?, ?)
Hibernate: insert into student (clazz, id) values (?, ?)
2018-12-23 13:39:19 DEBUG com.se.courses.service.TestService.addStudentTest[43] - com.se.courses.service.TestService.addStudentTest

таблица пользователей: https://i.ibb.co/MG0cNkF/01.png

таблица ученика: https://i.ibb.co/0qwv7R2/02.png

Почему консоль дважды выдавала оператор SQL вставки студента, но запись user = 3 не была вставлена ​​в таблицу ученика ??Пожалуйста, помогите мне.

добавить новые свойства журнала

logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql=trace

2018-12-24 00:53:19 DEBUG org.springframework.boot.StartupInfoLogger.logStarting[53] - Running with Spring Boot v2.1.0.RELEASE, Spring v5.1.2.RELEASE
2018-12-24 00:53:19 INFO  org.springframework.boot.SpringApplication.logStartupProfileInfo[675] - No active profile set, falling back to default profiles: default
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - create table authority (id bigint not null auto_increment, insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, name varchar(255), primary key (id)) engine=InnoDB
Hibernate: create table authority (id bigint not null auto_increment, insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, name varchar(255), primary key (id)) engine=InnoDB
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - create table course (id bigint not null auto_increment, insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, name varchar(255), teacher_id bigint, primary key (id)) engine=InnoDB
Hibernate: create table course (id bigint not null auto_increment, insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, name varchar(255), teacher_id bigint, primary key (id)) engine=InnoDB
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - create table course_detail (id bigint not null auto_increment, insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, course_id bigint, student_id bigint, primary key (id)) engine=InnoDB
Hibernate: create table course_detail (id bigint not null auto_increment, insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, course_id bigint, student_id bigint, primary key (id)) engine=InnoDB
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - create table experiment (id bigint not null auto_increment, file_extension varchar(255), insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, name varchar(255), course_id bigint, primary key (id)) engine=InnoDB
Hibernate: create table experiment (id bigint not null auto_increment, file_extension varchar(255), insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, name varchar(255), course_id bigint, primary key (id)) engine=InnoDB
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - create table experiment_detail (id bigint not null auto_increment, complete_time TIMESTAMP, file varchar(255), experiment_id bigint, student_id bigint, primary key (id)) engine=InnoDB
Hibernate: create table experiment_detail (id bigint not null auto_increment, complete_time TIMESTAMP, file varchar(255), experiment_id bigint, student_id bigint, primary key (id)) engine=InnoDB
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - create table homework (id bigint not null auto_increment, content varchar(255), insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, title varchar(255), course_id bigint, primary key (id)) engine=InnoDB
Hibernate: create table homework (id bigint not null auto_increment, content varchar(255), insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, title varchar(255), course_id bigint, primary key (id)) engine=InnoDB
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - create table homework_detail (id bigint not null auto_increment, complete_time TIMESTAMP, solution TEXT, homework_id bigint, student_id bigint, primary key (id)) engine=InnoDB
Hibernate: create table homework_detail (id bigint not null auto_increment, complete_time TIMESTAMP, solution TEXT, homework_id bigint, student_id bigint, primary key (id)) engine=InnoDB
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - create table student (clazz varchar(255), id bigint not null, primary key (id)) engine=InnoDB
Hibernate: create table student (clazz varchar(255), id bigint not null, primary key (id)) engine=InnoDB
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - create table teacher (id bigint not null, primary key (id)) engine=InnoDB
Hibernate: create table teacher (id bigint not null, primary key (id)) engine=InnoDB
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - create table user (id bigint not null auto_increment, insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, name varchar(255), number varchar(255), password varchar(255), authority_id bigint, primary key (id)) engine=InnoDB
Hibernate: create table user (id bigint not null auto_increment, insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, name varchar(255), number varchar(255), password varchar(255), authority_id bigint, primary key (id)) engine=InnoDB
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table user drop index UK_32852vmffyhhg5ov56amkcx7s
Hibernate: alter table user drop index UK_32852vmffyhhg5ov56amkcx7s
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table user add constraint UK_32852vmffyhhg5ov56amkcx7s unique (number)
Hibernate: alter table user add constraint UK_32852vmffyhhg5ov56amkcx7s unique (number)
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table course add constraint FKsybhlxoejr4j3teomm5u2bx1n foreign key (teacher_id) references teacher (id)
Hibernate: alter table course add constraint FKsybhlxoejr4j3teomm5u2bx1n foreign key (teacher_id) references teacher (id)
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table course_detail add constraint FKonm6feulb9dmgri1ywpvid8l2 foreign key (course_id) references course (id)
Hibernate: alter table course_detail add constraint FKonm6feulb9dmgri1ywpvid8l2 foreign key (course_id) references course (id)
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table course_detail add constraint FKdh9dl501ehcfblljjpmx28sya foreign key (student_id) references student (id)
Hibernate: alter table course_detail add constraint FKdh9dl501ehcfblljjpmx28sya foreign key (student_id) references student (id)
2018-12-24 00:53:22 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table experiment add constraint FK68ee92hji28v7m63lcbe49mxm foreign key (course_id) references course (id)
Hibernate: alter table experiment add constraint FK68ee92hji28v7m63lcbe49mxm foreign key (course_id) references course (id)
2018-12-24 00:53:23 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table experiment_detail add constraint FKtg40ugg4gkd1raph37jfjpko9 foreign key (experiment_id) references experiment (id)
Hibernate: alter table experiment_detail add constraint FKtg40ugg4gkd1raph37jfjpko9 foreign key (experiment_id) references experiment (id)
2018-12-24 00:53:23 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table experiment_detail add constraint FKqxlpw83x0k6mpn4401oiqosil foreign key (student_id) references student (id)
Hibernate: alter table experiment_detail add constraint FKqxlpw83x0k6mpn4401oiqosil foreign key (student_id) references student (id)
2018-12-24 00:53:23 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table homework add constraint FKaippn77cl5hhh944no78eone8 foreign key (course_id) references course (id)
Hibernate: alter table homework add constraint FKaippn77cl5hhh944no78eone8 foreign key (course_id) references course (id)
2018-12-24 00:53:23 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table homework_detail add constraint FK6w6svv21e1qib443omjcn6u4w foreign key (homework_id) references homework (id)
Hibernate: alter table homework_detail add constraint FK6w6svv21e1qib443omjcn6u4w foreign key (homework_id) references homework (id)
2018-12-24 00:53:23 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table homework_detail add constraint FKjqmtghar9welw7yyoan5n1516 foreign key (student_id) references student (id)
Hibernate: alter table homework_detail add constraint FKjqmtghar9welw7yyoan5n1516 foreign key (student_id) references student (id)
2018-12-24 00:53:23 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table student add constraint FKqytew32213tbnj8u0er377k3q foreign key (id) references user (id)
Hibernate: alter table student add constraint FKqytew32213tbnj8u0er377k3q foreign key (id) references user (id)
2018-12-24 00:53:23 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table teacher add constraint FKlicv62vmu1ydw117bbxqhkof1 foreign key (id) references user (id)
Hibernate: alter table teacher add constraint FKlicv62vmu1ydw117bbxqhkof1 foreign key (id) references user (id)
2018-12-24 00:53:23 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - alter table user add constraint FKokrgxdbtf7tirfx1d1qtg9n24 foreign key (authority_id) references authority (id)
Hibernate: alter table user add constraint FKokrgxdbtf7tirfx1d1qtg9n24 foreign key (authority_id) references authority (id)
2018-12-24 00:53:24 WARN  org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration$JpaWebConfiguration$JpaWebMvcConfiguration.openEntityManagerInViewInterceptor[234] - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2018-12-24 00:53:25 INFO  org.springframework.boot.StartupInfoLogger.logStarted[59] - Started AddUserTest in 6.043 seconds (JVM running for 6.775)
2018-12-24 00:53:25 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - insert into user (authority_id, insert_time, name, number, password) values (?, ?, ?, ?, ?)
Hibernate: insert into user (authority_id, insert_time, name, number, password) values (?, ?, ?, ?, ?)
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[53] - binding parameter [1] as [BIGINT] - [null]
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[53] - binding parameter [2] as [TIMESTAMP] - [null]
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[65] - binding parameter [3] as [VARCHAR] - [1]
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[53] - binding parameter [4] as [VARCHAR] - [null]
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[53] - binding parameter [5] as [VARCHAR] - [null]
2018-12-24 00:53:25 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - insert into student (clazz, id) values (?, ?)
Hibernate: insert into student (clazz, id) values (?, ?)
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[65] - binding parameter [1] as [VARCHAR] - [1]
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[65] - binding parameter [2] as [BIGINT] - [1]
2018-12-24 00:53:25 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - insert into user (authority_id, insert_time, name, number, password) values (?, ?, ?, ?, ?)
Hibernate: insert into user (authority_id, insert_time, name, number, password) values (?, ?, ?, ?, ?)
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[53] - binding parameter [1] as [BIGINT] - [null]
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[53] - binding parameter [2] as [TIMESTAMP] - [null]
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[65] - binding parameter [3] as [VARCHAR] - [2]
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[53] - binding parameter [4] as [VARCHAR] - [null]
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[53] - binding parameter [5] as [VARCHAR] - [null]
2018-12-24 00:53:25 DEBUG org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement[94] - insert into student (clazz, id) values (?, ?)
Hibernate: insert into student (clazz, id) values (?, ?)
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[65] - binding parameter [1] as [VARCHAR] - [2]
2018-12-24 00:53:25 TRACE org.hibernate.type.descriptor.sql.BasicBinder.bind[65] - binding parameter [2] as [BIGINT] - [2]
2018-12-24 00:53:25 DEBUG com.se.courses.service.TestService.addStudentTest[39] - com.se.courses.service.TestService.addStudentTest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...