#java #spring-boot #jpa
#java #spring-boot #jpa
Вопрос:
Я хочу сохранить экземпляр Class2 в базе данных. но когда я отправляю запрос GET на ‘/ two’, он сообщает об исключении org.postgresql.util.PSQLException: ERROR: null value in column "id1" of relation "class2" violates not-null constraint Detail: Failing row contains (2, null, null, 1).
что я могу сделать, чтобы успешно сохранить новый экземпляр Class2. и возможно ли сделать PK первичным ключом Class2 (PK является первичным ключом Class1 и внешним ключом Class2, я хочу сделать его первичным ключом Class2)
Class1.java
@Table
@Entity
@Data
@IdClass(PK.class)
@AllArgsConstructor
@NoArgsConstructor
public class Class1{
@Id
private int id1;
@Id
private int id2;
private int one;
}
Class2.java
@Table
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Class2{
@Id
private int id;
@OneToOne
@JoinColumns({
@JoinColumn(name = "id1", referencedColumnName = "id1", insertable = false, updatable = false),
@JoinColumn(name = "id2", referencedColumnName = "id2", insertable = false, updatable = false)
})
private Class1 class1;
private int two;
}
Контроллер
@RestController
public class ForeignController {
@Autowired
Class1Repository repository1;
@Autowired
Class2Repository repository2;
@GetMapping("/one")
public void createone(int id1, int id2, int one){
repository1.saveAndFlush(new Class1(id1, id2, one));
}
@GetMapping("/two")
public void createtwo(int id1, int id2, int two, int id){
Class1 class1 = repository1.getOne(new PK(id1, id2));
repository2.saveAndFlush(new Class2(id, class1, two));
}
}
Комментарии:
1. Это не то, как вы делаете составные ключи в jpa.
Ответ №1:
Вместо @IdClass используйте @EmbeddedId
@Table
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Class1{
@EmbeddedId
private PK pk;
private int one;
}
public class Class2{
@EmbeddedId
private PK pk;
@MapsId
@OneToOne
private Class1 class1;
private int two;
}