Сопоставление сущностей создает нежелательные столбцы на лету - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть 2 таблицы (Пользователь и Лента), связанные внешним ключом.После этого я использую Spring Boot и Hibernate, чтобы сделать запрос, чтобы просто распечатать все значения в таблице каналов.Но когда дело доходит до внешнего ключа и его значения, моя сущность, похоже, работает неправильно, когда создает на лету новый столбец, когда у меня уже есть столбец для внешнего ключа.

Могу ли я узнать, чтоЯ делаю не так?Новое в этой настройке JPA.Я не уверен, стоит ли мне сначала создавать свою схему или позволить JPA просто обрабатывать вещи в соответствии с моими настройками Entity.Очевидно, я упускаю что-то жизненно важное, но просто не могу на это указать.Пожалуйста помогите.

Вопрос: как мне сопоставить внешний ключ?Как и в карте внешнего ключа таблицы каналов 'имя_хозяина' для таблицы пользователя 'имя_пользователя * на объекте?

Структуры таблиц

enter image description here

Объекты

Пользовательский элемент

@Entity
public class User {
    @Id
    @Column(name = "username")
    public String username;

    @Column(name = "email")
    public String email;

    @Column(name = "password")
    public String password;

    @Basic
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_at")
    private Date createdAt;

    @Column(name = "online_status")
    private long onlineStatus;

    @Column(name = "account_status")
    private long accountStatus;

    //updated this based on Gopi's suggestion
    @OneToMany(mappedBy = "ownerName")
    private List<Feed> feeds;
}

Источник данных

@Entity
public class Feed {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "feed_id")
    private long feedId;

    @Column(name = "title")
    private String title;

    @Basic
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_at")
    private Date createdAt;

    @Basic
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "updated_at")
    private Date updatedAt;

    @ManyToOne
    @JoinColumn(name = "username")
//    @Column(name = "owner_name")
    private User ownerName;
}

Мой запрос просто получить все данные фида, где я получаю все данные, кроме значения для внешнего ключа, которое получается как ноль.(ожидая получить значение внешнего ключа вместо этого).

Мой контроллер вызывает этот метод, где я получаю все результаты, кроме значения внешнего ключа.

public interface FeedRepository extends JpaRepository<Feed, Long> {
    @Query("select f from Feed as f order by f.createdAt desc")
    List<Feed> getCurrentFeeds();
}

Проверка значений внутри таблиц.

Данные таблицы пользователя

enter image description here

Данные таблицы подачи

enter image description here

Если я запускаю свой текущий код, я на лету получаю дополнительный столбец, который мне не нужен, как упоминалось выше.

enter image description here

1 Ответ

0 голосов
/ 10 февраля 2019

Привет, это не удивительно, вы указали в качестве атрибута имени для @JoinColumn столбец, на который фактически ссылаются.Вам необходимо указать столбец внешнего ключа в таблице каналов, который является "имя_хозяина".Правильное полное определение @JoinColumn будет выглядеть следующим образом:

@JoinColumn(name="owner_name",referencedcolumn = "username")
    private User ownerName;

Если вам нет необходимости определять столбец, на который есть ссылка, но я определил его для завершения, чтобы вы понимали, что к чему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...