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
:{"id":null,"alien":{"id":null,"name":"awesome alien"},"appartments":[{"id":null,"alienBedrooms":[{"id":null,"description":"awesome bedroom"}]}]}
调试器引用方面的情况(在控制器中插入建筑之前的alienBuildingRepository.save(alienBuilding);
行上设置断点):
我让它像这样工作:
cascade=CascadeType.ALL
:{"id":null,"alien":{"id":null,"name":"awesome alien"},"appartments":[{"id":null,"alienBedrooms":[{"id":null,"description":"awesome bedroom"}]}]}
调试器引用方面的情况(在控制器中插入建筑之前的alienBuildingRepository.save(alienBuilding);
行上设置断点):
请提供您使用的hibernate版本、方言和配置。请提供您使用的hibernate版本、方言和配置。