не удалось сохранить дочерние объекты @ManyToOne - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь сохранить данные, используя JpaRepository , предоставляя данные дочерней сущности вместе с данными родительской сущности, но операция сохранения выполняется только для родительской сущности, но не для дочерних сущностей.Ниже моя реализация:

Моя дочерняя сущность:

@Entity
@Table(name = "justchild", schema = "test")
public class JustChildEntity implements Serializable {

    private static final long serialVersionUID = 8495817802073010928L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private long id;

    @Basic
    @Column(name = "cname", nullable = true)
    private String cname;

    @ManyToOne
    @JoinColumn(name = "fk_id", referencedColumnName = "id")
    private JustParentEntity justParentEntity;

    // getters and setters
}

Моя родительская сущность:

@Entity
@Table(name = "justparent", schema = "test")
public class JustParentEntity implements Serializable {

    private static final long serialVersionUID = -748956247024967638L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private long id;

    @Basic
    @Column(name = "name", nullable = true)
    private String name;

    @OneToMany(mappedBy = "justParentEntity", targetEntity = JustChildEntity.class)
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private Set<JustChildEntity> justChildEntities;

    // getters and setters
}

Моя реализация через контроллер:

@Autowired
private JustParentRepo justParentRepo;

@GetMapping("/test-persist-many")
@ResponseBody
public void testPersistMany() {

    JustParentEntity justParentEntity = new JustParentEntity();
    justParentEntity.setName("parent 1");

    JustChildEntity justChildEntity = new JustChildEntity();
    justChildEntity.setCname("child Name 1");
    justChildEntity.setJustParentEntity(justParentEntity);

    JustChildEntity justChildEntity2 = new JustChildEntity();
    justChildEntity2.setCname("child Name 2");
    justChildEntity.setJustParentEntity(justParentEntity);

    Set<JustChildEntity> justChildEntities = new HashSet<>();
    justChildEntities.add(justChildEntity);
    justChildEntities.add(justChildEntity2);

    justParentEntity.setJustChildEntities(justChildEntities);

    justParentRepo.save(justParentEntity);

    ObjectMapper objectMapper = new ObjectMapper();
    try {
        String json = objectMapper.writeValueAsString(justParentEntity);
        System.out.println(json);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}

Интерфейс моего репозитория:

@Repository
@Transactional
public interface JustParentRepo extends JpaRepository<JustParentEntity, Long> {
}

Вывод My Seriallized json выглядит следующим образом:

{
    "id": 8,
    "name": "parent 1",
    "justChildEntities": [{
        "id": 0,
        "cname": "child Name 1",
        "justParentEntity": null
    }, {
        "id": 0,
        "cname": "child Name 2",
        "justParentEntity": null
    }]
}

Здесь я вижу дочерние объекты, не имеющие значения идентификатора и не назначенные внешним ключам.Я использую Spring Boot 1.5.13.Пожалуйста, помогите.

ОБНОВЛЕНИЕ

я добавил justParentRepo.flush() после сохранения, но он не работает.

Мой файл application.properties:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=12345
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=15
spring.datasource.tomcat.test-while-idle=true
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.time-between-eviction-runs-millis=3600000
spring.datasource.tomcat.validation-query=SELECT 1
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.id.new_generator_mappings=true
spring.jpa.properties.hibernate.format_sql=true

1 Ответ

0 голосов
/ 22 октября 2018

Попробуйте это:

@OneToMany(mappedBy = "justParentEntity", cascade = CascadeType.ALL)

Если это не сработает, не могли бы вы указать параметры подключения в файле свойств приложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...