Множественный внешний ключ в java JPA

#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;

}