Search code examples
javajsonspring-boothibernatejpa

Error in save method Hibernate with relation ManyToOne


i'm trying save a class Equipment, howhever when i'm using save method in Service, i'm having an error:

" ERROR 14620 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: column "name_model" of relation "equipment_model" does not exist "

more specifically, the problem is in SQL command: 'Hibernate: insert into operation.equipment_model (name, id) values (?, ?)'

Having this problem, I have a doubt, to create a new Equipment, I really need create a EquipmentModel too? Because in my SQL "EquipmentModel" have only 2 rows: id, name.

EQUIPMENT

@Entity
@Table(name="equipment")
public class Equipment implements Serializable {
    private static final long serialVersionUID = 1L;
    public Equipment(){
        equipmentModel = new EquipmentModel();
        this.equipment_model_id = equipmentModel.getId();
    }
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;

@Column(nullable = false)
private String name;

@Column(insertable = false, updatable = false, name="equipment_model_id")
private UUID equipment_model_id;


@NotNull
@ManyToOne( fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JsonIgnore
private EquipmentModel equipmentModel;

//Getters and Setters }

EQUIPMENT MODEL

@Entity
@Table(name="equipment_model")
public class EquipmentModel implements Serializable {
    private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;

@Column(nullable = false)
private String nameModel;

@OneToMany(mappedBy = "equipmentModel", cascade = CascadeType.ALL)
private List<Equipment> equipments;

      // Getters Setters }

EQUIPMENT SERVICE:

@Service
 public class EquipmentService { final EquipmentRepository equipmentRepository;
public EquipmentService(EquipmentRepository equipmentRepository)
{
    this.equipmentRepository = equipmentRepository;
}


@Transactional
public Equipment save(Equipment equipment)
{ return equipmentRepository.save(equipment);    }

}


Solution

  • The reason is because of your annotations:

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private EquipmentModel equipmentModel;
    

    cascade = CascadeType.ALL is getting all actions from one entity to another. That means deletes, persists (what you are trying) and many more.

    You might want to change your annotation to

    @ManyToOne(fetch = FetchType.EAGER)
    private EquipmentModel equipmentModel;
    

    This means, that there are no cascade types, because the default value is an empty array. That means it will not try to save anything from your EquipmentModel while also trying to save your Equipment.