У меня есть две сущности 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> {
}