Spring и JPA 2.0 - составной ключ во многих для многих отношениях с дополнительным столбцом - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть две сущности Foo и Bar в отношениях «многие ко многим». Присоединяемая сущность - FooBar, и, поскольку у этой сущности есть другое свойство (собственный идентификатор), я использовал @ManyToOne на стороне владельца (FooBar) и @OneToMany в зависимых сущностях (Foo и Bar). ). Как создать FooBarRepository расширение CrudRepository без явного поля составного ключа внутри FooBar? В идеале я не хочу менять членов моего FooBar класса.

Я пытался использовать @IdClass, но не хочу, чтобы внутри полей fooId и barId FooBar и я получаю это исключение:

Caused by: org.hibernate.AnnotationException: Property of @IdClass not found in entity com.nano.testers.test.FooBar: barId

Я также пытался явно следовать документации IdClass и ссылочных столбцов по имени, но мне не удалось (возможно, решение лежитгде-то здесь?)

Имена полей или свойств в классе первичного ключа и поля первичного ключа или свойства объекта должны соответствовать, а их типы должны совпадать.

Я попытался изменить имена полей внутри Foo и Bar на id, чтобы в объединяющей таблице на них ссылались как foo_id и bar_id, но исключением былото же самое.

Я не хочу использовать @EmbeddedId, если это означает, что мне нужно иметь поле типа FooBarPk внутри класса FooBar.

@Entity
public class Foo {
    @Id
    private Long fooId;

    @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
    private Set<FooBar> foobars;
}
@Entity
public class Bar {
    @Id
    private Long barId;

    @OneToMany(mappedBy = "bar", cascade = CascadeType.ALL)
    private Set<FooBar> foobars;
}
@Entity
//@IdClass(FooBarPk.class)
public class FooBar implements Serializable {
    @Id
    private Long fooBarId;

    @Id
    @ManyToOne
    @JoinColumn
    private Foo foo;

    @Id
    @ManyToOne
    @JoinColumn
    private Bar bar;

}
public class FooBarPk implements Serializable {
    private Long fooId;
    private Long barId;
    private Long fooBarId;
}
public interface FooBarRepository extends CrudRepository<FooBar, FooBarPk> {
}

1 Ответ

0 голосов
/ 07 ноября 2019

Похоже, что имена полей в классе составного ключа должны совпадать с именами ссылочных объектов. Я думаю, что эти имена не соответствуют принципам чистого кода, но мне пока придется жить с этим решением.

public class FooBarPk implements Serializable {
    private Long foo;
    private Long bar;
    private Long fooBarId;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...