Java 冬眠不';t插入子实体:Hibernate:选择nextval(';Hibernate#u序列';)

Java 冬眠不';t插入子实体:Hibernate:选择nextval(';Hibernate#u序列';),java,spring,hibernate,spring-mvc,jpa,Java,Spring,Hibernate,Spring Mvc,Jpa,我有四个类:Alien,AlienAppartment,AlienBuilding和AlienBedroom。它们都有manytone关系: Alien -> has many AlienBuilding -> has many AlienAppartment -> has many AlienBedroom 我试图通过此控制器插入带有AlienBuilding对象的JSON: AlienController.java: @CrossOrigin @RestControlle

我有四个类:
Alien
AlienAppartment
AlienBuilding
AlienBedroom
。它们都有
manytone
关系:

Alien -> has many AlienBuilding -> has many AlienAppartment -> has many AlienBedroom
我试图通过此控制器插入带有
AlienBuilding
对象的JSON:

AlienController.java

@CrossOrigin
@RestController
public class AliensController {
    @Autowired
    private AlienBuildingRepository alienBuildingRepository;
    @Autowired
    private AlienRepository alienRepository;
    @Autowired
    private AlienBedroomRepository alienBedroomRepository;
    @Autowired
    private AlienAppartmentRepository alienAppartmentRepository;
    
    ...
 
    @GetMapping("/api/aliens/buildings/insert")
    @Transactional
    public String insertBuilding(
                    @RequestBody AlienBuilding alienBuilding)  {
     alienBuildingRepository.save(alienBuilding);

     return "OK";
    }
}
{"id":null,"alien":{"id":null,"name":"some alien"},"appartments":[{"id":null,"alienBedrooms":[{"id":null,"description":"cool"}]}]}
@Entity
@Table(name = "aliens")
public class Alien  {
    @Id @GeneratedValue
    private int id;

    public Alien()  {}

    @Column
    private String name;

    @OneToMany(mappedBy = "alien", fetch=FetchType.EAGER)
    @JsonIgnore
    private Set<AlienBuilding> buildings;

    /**
     * Getters,setters
     */

@Entity
@Table(name = "alien_appartments")
public class AlienAppartment {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO )
    public Long id;

    public AlienAppartment() {
    }

    @OneToMany(mappedBy = "appartment", fetch = FetchType.EAGER,
                        cascade = CascadeType.ALL)
    private Set<AlienBedroom> alienBedrooms;

    @ManyToOne
    @JoinColumn(name = "building_id")
    @JsonIgnore
    private AlienBuilding building;


    /**
     * Getters,setters
     */
@Entity
@Table(name = "alien_bedrooms")
public class AlienBedroom {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO )
    private Long id;

    public AlienBedroom()  {}

    @Column
    private String description;

    @ManyToOne
    @JoinColumn(name = "appartment_id")
    @JsonIgnore
   private AlienAppartment appartment;

    /**
     * Getters,setters
     */
@Entity
@Table(name = "alien_buildings")
public class AlienBuilding {
    @Id
    @GeneratedValue
    public Long id;

    public AlienBuilding() {
    }

    @ManyToOne
    @JoinColumn(name = "alien_id")
    private Alien alien;

    @OneToMany(mappedBy = "building", fetch = FetchType.EAGER)
    private Set<AlienAppartment> appartments;

    /**
     * Getters, setters
     */
@Repository
public interface AlienAppartmentRepository extends
                JpaRepository<AlienAppartment, Long> {
}

@Repository
public interface AlienBedroomRepository extends JpaRepository<AlienBedroom, Long> {
}

@Repository
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
public interface AlienBuildingRepository
        extends JpaRepository<AlienBuilding, Long> {
}

@Repository
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
public interface AlienRepository extends JpaRepository<Alien, Long> {
}
JSON

@CrossOrigin
@RestController
public class AliensController {
    @Autowired
    private AlienBuildingRepository alienBuildingRepository;
    @Autowired
    private AlienRepository alienRepository;
    @Autowired
    private AlienBedroomRepository alienBedroomRepository;
    @Autowired
    private AlienAppartmentRepository alienAppartmentRepository;
    
    ...
 
    @GetMapping("/api/aliens/buildings/insert")
    @Transactional
    public String insertBuilding(
                    @RequestBody AlienBuilding alienBuilding)  {
     alienBuildingRepository.save(alienBuilding);

     return "OK";
    }
}
{"id":null,"alien":{"id":null,"name":"some alien"},"appartments":[{"id":null,"alienBedrooms":[{"id":null,"description":"cool"}]}]}
@Entity
@Table(name = "aliens")
public class Alien  {
    @Id @GeneratedValue
    private int id;

    public Alien()  {}

    @Column
    private String name;

    @OneToMany(mappedBy = "alien", fetch=FetchType.EAGER)
    @JsonIgnore
    private Set<AlienBuilding> buildings;

    /**
     * Getters,setters
     */

@Entity
@Table(name = "alien_appartments")
public class AlienAppartment {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO )
    public Long id;

    public AlienAppartment() {
    }

    @OneToMany(mappedBy = "appartment", fetch = FetchType.EAGER,
                        cascade = CascadeType.ALL)
    private Set<AlienBedroom> alienBedrooms;

    @ManyToOne
    @JoinColumn(name = "building_id")
    @JsonIgnore
    private AlienBuilding building;


    /**
     * Getters,setters
     */
@Entity
@Table(name = "alien_bedrooms")
public class AlienBedroom {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO )
    private Long id;

    public AlienBedroom()  {}

    @Column
    private String description;

    @ManyToOne
    @JoinColumn(name = "appartment_id")
    @JsonIgnore
   private AlienAppartment appartment;

    /**
     * Getters,setters
     */
@Entity
@Table(name = "alien_buildings")
public class AlienBuilding {
    @Id
    @GeneratedValue
    public Long id;

    public AlienBuilding() {
    }

    @ManyToOne
    @JoinColumn(name = "alien_id")
    private Alien alien;

    @OneToMany(mappedBy = "building", fetch = FetchType.EAGER)
    private Set<AlienAppartment> appartments;

    /**
     * Getters, setters
     */
@Repository
public interface AlienAppartmentRepository extends
                JpaRepository<AlienAppartment, Long> {
}

@Repository
public interface AlienBedroomRepository extends JpaRepository<AlienBedroom, Long> {
}

@Repository
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
public interface AlienBuildingRepository
        extends JpaRepository<AlienBuilding, Long> {
}

@Repository
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
public interface AlienRepository extends JpaRepository<Alien, Long> {
}
然而,我得到的只是

Hibernate: select nextval ('hibernate_sequence')
控制台中的输出。然而,在调试器中,我可以看到JSON已经映射到
AlienBuilding
对象

我可以试着通过

    @GetMapping("/api/aliens/buildings/insert")
    @Transactional
    public String insertBuilding(
                    @RequestBody AlienBuilding alienBuilding)  {
        //alienBuildingRepository.save(alienBuilding);

        alienRepository.save(alienBuilding.getAlien());
        for (AlienAppartment appartment: alienBuilding.getAppartments())  {
            for (AlienBedroom bedroom: appartment.getAlienBedrooms())  {
                alienBedroomRepository.save(bedroom);
                alienBedroomRepository.flush();
            }

            alienAppartmentRepository.save(appartment);
            alienAppartmentRepository.flush();
        }

        alienBuildingRepository.save(alienBuilding);
        alienBuildingRepository.flush();

        return "OK";
    }
我会得到这个输出:

Hibernate: select nextval ('hibernate_sequence')
Hibernate: select nextval ('hibernate_sequence')
Hibernate: insert into aliens (name, id) values (?, ?)
Hibernate: insert into alien_bedrooms (appartment_id, description, id) values (?, ?, ?)
Hibernate: select nextval ('hibernate_sequence')
Hibernate: insert into alien_appartments (building_id, id) values (?, ?)
Hibernate: select nextval ('hibernate_sequence')
Hibernate: insert into alien_buildings (alien_id, id) values (?, ?)
但是
alien_公寓
表中的
building_id
列以及
alien_卧室
表中的
appartment_id
列将为空

这些是我的实体:

Alien.java

@CrossOrigin
@RestController
public class AliensController {
    @Autowired
    private AlienBuildingRepository alienBuildingRepository;
    @Autowired
    private AlienRepository alienRepository;
    @Autowired
    private AlienBedroomRepository alienBedroomRepository;
    @Autowired
    private AlienAppartmentRepository alienAppartmentRepository;
    
    ...
 
    @GetMapping("/api/aliens/buildings/insert")
    @Transactional
    public String insertBuilding(
                    @RequestBody AlienBuilding alienBuilding)  {
     alienBuildingRepository.save(alienBuilding);

     return "OK";
    }
}
{"id":null,"alien":{"id":null,"name":"some alien"},"appartments":[{"id":null,"alienBedrooms":[{"id":null,"description":"cool"}]}]}
@Entity
@Table(name = "aliens")
public class Alien  {
    @Id @GeneratedValue
    private int id;

    public Alien()  {}

    @Column
    private String name;

    @OneToMany(mappedBy = "alien", fetch=FetchType.EAGER)
    @JsonIgnore
    private Set<AlienBuilding> buildings;

    /**
     * Getters,setters
     */

@Entity
@Table(name = "alien_appartments")
public class AlienAppartment {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO )
    public Long id;

    public AlienAppartment() {
    }

    @OneToMany(mappedBy = "appartment", fetch = FetchType.EAGER,
                        cascade = CascadeType.ALL)
    private Set<AlienBedroom> alienBedrooms;

    @ManyToOne
    @JoinColumn(name = "building_id")
    @JsonIgnore
    private AlienBuilding building;


    /**
     * Getters,setters
     */
@Entity
@Table(name = "alien_bedrooms")
public class AlienBedroom {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO )
    private Long id;

    public AlienBedroom()  {}

    @Column
    private String description;

    @ManyToOne
    @JoinColumn(name = "appartment_id")
    @JsonIgnore
   private AlienAppartment appartment;

    /**
     * Getters,setters
     */
@Entity
@Table(name = "alien_buildings")
public class AlienBuilding {
    @Id
    @GeneratedValue
    public Long id;

    public AlienBuilding() {
    }

    @ManyToOne
    @JoinColumn(name = "alien_id")
    private Alien alien;

    @OneToMany(mappedBy = "building", fetch = FetchType.EAGER)
    private Set<AlienAppartment> appartments;

    /**
     * Getters, setters
     */
@Repository
public interface AlienAppartmentRepository extends
                JpaRepository<AlienAppartment, Long> {
}

@Repository
public interface AlienBedroomRepository extends JpaRepository<AlienBedroom, Long> {
}

@Repository
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
public interface AlienBuildingRepository
        extends JpaRepository<AlienBuilding, Long> {
}

@Repository
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
public interface AlienRepository extends JpaRepository<Alien, Long> {
}
AlienBuilding.java

@CrossOrigin
@RestController
public class AliensController {
    @Autowired
    private AlienBuildingRepository alienBuildingRepository;
    @Autowired
    private AlienRepository alienRepository;
    @Autowired
    private AlienBedroomRepository alienBedroomRepository;
    @Autowired
    private AlienAppartmentRepository alienAppartmentRepository;
    
    ...
 
    @GetMapping("/api/aliens/buildings/insert")
    @Transactional
    public String insertBuilding(
                    @RequestBody AlienBuilding alienBuilding)  {
     alienBuildingRepository.save(alienBuilding);

     return "OK";
    }
}
{"id":null,"alien":{"id":null,"name":"some alien"},"appartments":[{"id":null,"alienBedrooms":[{"id":null,"description":"cool"}]}]}
@Entity
@Table(name = "aliens")
public class Alien  {
    @Id @GeneratedValue
    private int id;

    public Alien()  {}

    @Column
    private String name;

    @OneToMany(mappedBy = "alien", fetch=FetchType.EAGER)
    @JsonIgnore
    private Set<AlienBuilding> buildings;

    /**
     * Getters,setters
     */

@Entity
@Table(name = "alien_appartments")
public class AlienAppartment {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO )
    public Long id;

    public AlienAppartment() {
    }

    @OneToMany(mappedBy = "appartment", fetch = FetchType.EAGER,
                        cascade = CascadeType.ALL)
    private Set<AlienBedroom> alienBedrooms;

    @ManyToOne
    @JoinColumn(name = "building_id")
    @JsonIgnore
    private AlienBuilding building;


    /**
     * Getters,setters
     */
@Entity
@Table(name = "alien_bedrooms")
public class AlienBedroom {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO )
    private Long id;

    public AlienBedroom()  {}

    @Column
    private String description;

    @ManyToOne
    @JoinColumn(name = "appartment_id")
    @JsonIgnore
   private AlienAppartment appartment;

    /**
     * Getters,setters
     */
@Entity
@Table(name = "alien_buildings")
public class AlienBuilding {
    @Id
    @GeneratedValue
    public Long id;

    public AlienBuilding() {
    }

    @ManyToOne
    @JoinColumn(name = "alien_id")
    private Alien alien;

    @OneToMany(mappedBy = "building", fetch = FetchType.EAGER)
    private Set<AlienAppartment> appartments;

    /**
     * Getters, setters
     */
@Repository
public interface AlienAppartmentRepository extends
                JpaRepository<AlienAppartment, Long> {
}

@Repository
public interface AlienBedroomRepository extends JpaRepository<AlienBedroom, Long> {
}

@Repository
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
public interface AlienBuildingRepository
        extends JpaRepository<AlienBuilding, Long> {
}

@Repository
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
public interface AlienRepository extends JpaRepository<Alien, Long> {
}
@实体
@表(name=“外来建筑”)
公共类AlienBuilding{
@身份证
@生成值
公共长id;
公共建筑{
}
@许多酮
@JoinColumn(name=“alien_id”)
私人外侨;
@OneToMany(mappedBy=“building”,fetch=FetchType.EAGER)
私人套房;
/**
*能手,二传手
*/
存储库

@CrossOrigin
@RestController
public class AliensController {
    @Autowired
    private AlienBuildingRepository alienBuildingRepository;
    @Autowired
    private AlienRepository alienRepository;
    @Autowired
    private AlienBedroomRepository alienBedroomRepository;
    @Autowired
    private AlienAppartmentRepository alienAppartmentRepository;
    
    ...
 
    @GetMapping("/api/aliens/buildings/insert")
    @Transactional
    public String insertBuilding(
                    @RequestBody AlienBuilding alienBuilding)  {
     alienBuildingRepository.save(alienBuilding);

     return "OK";
    }
}
{"id":null,"alien":{"id":null,"name":"some alien"},"appartments":[{"id":null,"alienBedrooms":[{"id":null,"description":"cool"}]}]}
@Entity
@Table(name = "aliens")
public class Alien  {
    @Id @GeneratedValue
    private int id;

    public Alien()  {}

    @Column
    private String name;

    @OneToMany(mappedBy = "alien", fetch=FetchType.EAGER)
    @JsonIgnore
    private Set<AlienBuilding> buildings;

    /**
     * Getters,setters
     */

@Entity
@Table(name = "alien_appartments")
public class AlienAppartment {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO )
    public Long id;

    public AlienAppartment() {
    }

    @OneToMany(mappedBy = "appartment", fetch = FetchType.EAGER,
                        cascade = CascadeType.ALL)
    private Set<AlienBedroom> alienBedrooms;

    @ManyToOne
    @JoinColumn(name = "building_id")
    @JsonIgnore
    private AlienBuilding building;


    /**
     * Getters,setters
     */
@Entity
@Table(name = "alien_bedrooms")
public class AlienBedroom {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO )
    private Long id;

    public AlienBedroom()  {}

    @Column
    private String description;

    @ManyToOne
    @JoinColumn(name = "appartment_id")
    @JsonIgnore
   private AlienAppartment appartment;

    /**
     * Getters,setters
     */
@Entity
@Table(name = "alien_buildings")
public class AlienBuilding {
    @Id
    @GeneratedValue
    public Long id;

    public AlienBuilding() {
    }

    @ManyToOne
    @JoinColumn(name = "alien_id")
    private Alien alien;

    @OneToMany(mappedBy = "building", fetch = FetchType.EAGER)
    private Set<AlienAppartment> appartments;

    /**
     * Getters, setters
     */
@Repository
public interface AlienAppartmentRepository extends
                JpaRepository<AlienAppartment, Long> {
}

@Repository
public interface AlienBedroomRepository extends JpaRepository<AlienBedroom, Long> {
}

@Repository
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
public interface AlienBuildingRepository
        extends JpaRepository<AlienBuilding, Long> {
}

@Repository
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
public interface AlienRepository extends JpaRepository<Alien, Long> {
}
@存储库
公共接口AlienAppartmentRepository扩展
JpaRepository{
}
@存储库
公共接口AlienBedroomRepository扩展了JpaRepository{
}
@存储库
@事务性(value=“transactionManager”,传播=传播。必需)
公共接口AlienBuildingRepository
扩展JPA假设{
}
@存储库
@事务性(value=“transactionManager”,传播=传播。必需)
公共接口AlienRepository扩展了JpaRepository{
}

我让它像这样工作:

  • 我在所有内容中添加了
    cascade=CascadeType.ALL
  • 我发送的JSON:

    {"id":null,"alien":{"id":null,"name":"awesome alien"},"appartments":[{"id":null,"alienBedrooms":[{"id":null,"description":"awesome bedroom"}]}]}
    
    调试器引用方面的情况(在控制器中插入建筑之前的
    alienBuildingRepository.save(alienBuilding);
    行上设置断点):


    我让它像这样工作:

  • 我在所有内容中添加了
    cascade=CascadeType.ALL
  • 我发送的JSON:

    {"id":null,"alien":{"id":null,"name":"awesome alien"},"appartments":[{"id":null,"alienBedrooms":[{"id":null,"description":"awesome bedroom"}]}]}
    
    调试器引用方面的情况(在控制器中插入建筑之前的
    alienBuildingRepository.save(alienBuilding);
    行上设置断点):


    请提供您使用的hibernate版本、方言和配置。请提供您使用的hibernate版本、方言和配置。