Complex primary key and data break error

I use Hibernate and MySql, and today I set the composite primary key in one of my tables, so below:

DefSelfLearning

DefSelfLearning

And this object is OneToMany with SelfLearning:

enter image description here

This is my java object:

@Entity @Table(name = "defselflearning", catalog = "ats") public class DefSelfLearning implements java.io.Serializable { /** * */ private static final long serialVersionUID = 1L; @EmbeddedId private DefSelfLearningKeys defSelfLearningKeys; private Ecu ecu; private String excelColumn; @JsonIgnore private Set<SelfLearning> selfLearnings = new HashSet<SelfLearning>(0); public DefSelfLearning() { } public DefSelfLearning(DefSelfLearningKeys defSelfLearningKeys, Ecu ecu) { this.defSelfLearningKeys = defSelfLearningKeys; this.ecu = ecu; } public DefSelfLearning(Ecu ecu, DefSelfLearningKeys defSelfLearningKeys, String excelColumn, Set<SelfLearning> selfLearnings) { this.ecu = ecu; this.defSelfLearningKeys = defSelfLearningKeys; this.excelColumn = excelColumn; this.selfLearnings = selfLearnings; } @Id public DefSelfLearningKeys getDefSelfLearningKeys() { return this.defSelfLearningKeys; } public void setDefSelfLearningKeys(DefSelfLearningKeys defSelfLearningKeys) { this.defSelfLearningKeys = defSelfLearningKeys; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "id_ecu", nullable = false) public Ecu getEcu() { return this.ecu; } public void setEcu(Ecu ecu) { this.ecu = ecu; } @Column(name = "excelColumn", length = 2) public String getExcelColumn() { return this.excelColumn; } public void setExcelColumn(String excelColumn) { this.excelColumn = excelColumn; } @OneToMany(fetch = FetchType.LAZY, mappedBy = "defSelfLearning") public Set<SelfLearning> getSelfLearnings() { return this.selfLearnings; } public void setSelfLearnings(Set<SelfLearning> selfLearnings) { this.selfLearnings = selfLearnings; } } 

class for composite key:

  @Embeddable public class DefSelfLearningKeys implements Serializable { private static final long serialVersionUID = 1L; protected String parName; protected String description; protected String note; public DefSelfLearningKeys() {} public DefSelfLearningKeys(String parName, String description, String note) { this.parName = parName; this.description = description; this.note = note; } @Column(name = "parName", nullable = false, length = 15) public String getParName() { return this.parName; } public void setParName(String parName) { this.parName = parName; } @Column(name = "description", nullable = false, length = 100) public String getDescription() { return this.description; } public void setDescription(String description) { this.description = description; } @Column(name = "note", nullable = false, length = 100) public String getNote() { return this.note; } public void setNote(String note) { this.note = note; } } 

and SelfLearning class:

 @Entity @Table(name = "selflearning", catalog = "ats") public class SelfLearning implements java.io.Serializable { /** * */ private static final long serialVersionUID = 1L; private int idSelfLearning; private Acquisition acquisition; private DefSelfLearning defSelfLearning; private String value; public SelfLearning() { } public SelfLearning(int idSelfLearning, Acquisition acquisition, DefSelfLearning defSelfLearning) { this.idSelfLearning = idSelfLearning; this.acquisition = acquisition; this.defSelfLearning = defSelfLearning; } public SelfLearning(int idSelfLearning, Acquisition acquisition, DefSelfLearning defSelfLearning, String value) { this.idSelfLearning = idSelfLearning; this.acquisition = acquisition; this.defSelfLearning = defSelfLearning; this.value = value; } @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "id_selfLearning", unique = true, nullable = false) public int getIdSelfLearning() { return this.idSelfLearning; } public void setIdSelfLearning(int idSelfLearning) { this.idSelfLearning = idSelfLearning; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "id_acquisition", nullable = false) public Acquisition getAcquisition() { return this.acquisition; } public void setAcquisition(Acquisition acquisition) { this.acquisition = acquisition; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "id_parName", nullable = false), @JoinColumn(name = "id_description", nullable = false), @JoinColumn(name = "id_note", nullable = false) }) public DefSelfLearning getDefSelfLearning() { return this.defSelfLearning; } public void setDefSelfLearning(DefSelfLearning defSelfLearning) { this.defSelfLearning = defSelfLearning; } @Column(name = "value") public String getValue() { return this.value; } public void setValue(String value) { this.value = value; } } 

but when I create defSelfLearning everything works fine, but when I create selfLearning, I get a MysqlDataTruncation exception:

 Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'id_parName' at row 1 

This error is enough to check, but I did not find where the problem is, this is the code for creating SelfLearning:

 for (DefSelfLearning defSelfLearning:defSelfLearningList){ SelfLearning selfLearning=new SelfLearning(); String key = defSelfLearning.getExcelColumn()+index; String value = actualRowValues.get(key); selfLearning.setAcquisition(findByCarAndExcelRow(carServices.findById(acquisitionForm.getCar()), index)); selfLearning.setDefSelfLearning(defSelfLearning); selfLearning.setValue(value); System.out.println(selfLearning.getDefSelfLearning().getDefSelfLearningKeys().getParName()); selfLearningServices.create(selfLearning); } 

Do you find where the problem is? thanks

This is the first line of defSelfLearning and it is where the code failure

enter image description here

if I install manually, this works:

enter image description here

This is the java debugging screen of the first code that fails:

enter image description here

+5
source share
3 answers

SelfLearning does not match columns correctly, id_parName = id_description, id_description = id_note and id_note = id_parName, but why? So I read:

When the JoinColumns annotation is used, the name and reference ColumnName elements must be specified in each of these JoinColumn annotations.

I added this element like this:

 @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "id_parName", referencedColumnName="parName", nullable = false), @JoinColumn(name = "id_description", referencedColumnName="description", nullable = false), @JoinColumn(name = "id_note", referencedColumnName="note", nullable = false) }) public DefSelfLearning getDefSelfLearning() { return this.defSelfLearning; } 

And he works

0
source

You are trying to insert a char that is longer than 15 in the id_parName column

0
source

In your entities you need to select a field and a getter. And all annotations should be in the margins, or all of them should be in getters, you cannot mix both approaches (unless you use the @AccessType annotation). Hibernate / Jpa will select the used aspect from the annotation on Id.

Change @Id on the first embedded object to @EmbeddedId and make sure it is on the receiver.

0
source

Source: https://habr.com/ru/post/1236333/


All Articles