У меня есть класс с 2 полями, помеченными @Id
@Entity
@Table(name = "baspas")
class BasPas
@Id
@ManyToOne
@JoinColumn(name = "bas_id", referenceColumnName = "id")
private Bas basboard;
@Id
@ManyToOne
@JoinColumn(name = "pas_id", referenceColumnName = "id")
private pas pasboard;
//
Я преобразовал их в класс Embedded и вытащил два вышеуказанных поля @Id в классе BasPasPK. Это позволит мне создать интерфейс, который расширит интерфейс JPARepository.
@Embeddable
class BasPasPK {
@ManyToOne
@JoinColumn(name = "bas_id", referenceColumnName = "id")
private Bas basboard;
@ManyToOne
@JoinColumn(name = "pas_id", referenceColumnName = "id")
private pas pasboard;
//
}
Поскольку оба этих поля аннотированы @ManyToOne, существует еще один конец отношения, где в этих полях указано «mappedBy». для например.
@Entity
class Another{
.
.
@OneToMany(mappedBy = "basboard" cascade = CascadeType.ALL)
private set<BasPas> basPas;
.
.
.
}
Но после рефакторинга, как получить доступ к другому концу класса.
Я имею в виду, что когда я делаю mvn spring-boot:run, я получаю следующее исключение
org.hibernate.AnnotationException: mappedBy ссылается на неизвестное свойство целевого объекта
то, что я сделал, это изменить имя класса в
@Entity
class Another{
.
.
@OneToMany(mappedBy = "basboard" cascade = CascadeType.ALL)
private Set<BasPas> basPas;
.
.
.
}
к этому
class Another{
.
.
@OneToMany(mappedBy = "bas" cascade = CascadeType.ALL)
private set<BasPasPk> basPas; //changed the classname in angle brackets to BasPasPk
.
.
.
}
Но после этого я начал получать следующее исключение.
org.hibernate.AnnotationException: использование @OneToMany или @ManyToMany для неотображенного класса.
Как это исправить, я имею в виду, как получить доступ к этим свойствам в другом классе после извлечения этих двух свойств из встроенного класса.
Вы пытались аннотировать класс BasPas с помощью @Entity ?
Это уже сущность, извините, я забыл упомянуть об этом.
попробуйте так: (Предположим, что имя свойства BasPasPK в вашей сущности — id)
@Entity
class Bas{
.
.
@OneToMany(mappedBy = "id.basboard" cascade = CascadeType.ALL)
private Set<BasPas> basPas;
.
.
.
}
Великолепно, должен сказать, что вы гениальны, такое простое решение, я бы догадался. Как вы поняли, что мы можем использовать id.fieldname, я имею в виду, можете ли вы указать мне какой-нибудь источник, чтобы узнать это более подробно.
чувак ты там
Что именно BasPasPk установлено внутри Class Another?