Как создать постоянный класс с внешним ключом

#java #jpa

#java #jpa

Вопрос:

У меня есть таблица, и я должен написать классы с аннотациями JPA для постоянных. Таблицы следующие:

 CREATE TABLE `team` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `player` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `team_id` int(11) unsigned NOT NULL,
    `name` varchar(16536) NOT NULL,
    `position` varchar(16536) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `team_id` (`team_id`),
  CONSTRAINT `player_ibfk_1` FOREIGN KEY (`team_id`) REFERENCES `team` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  

И я попробовал это, но я думаю, что это неполно. Чего-то не хватает? Это правильно, что я написал?

 @Entity
public class Team {
    @Id @GeneratedValue long id;
    private String name;
}

@Entity
public class Player {
    @Id @GeneratedValue long id;
    long teamId;
    String name;
    String position;
}
  

Ответ №1:

В команде больше игроков. Это отношение 1: N. В JPA вы создаете его, используя аннотацию @OneToMany:

 @Entity
@Table("team")
public class Team {
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    @Column(nullable = false)
    String name;

    @OneToMany(mappedBy = "team", cascade = CascadeType.ALL)
    List<Player> players = new ArrayList<>();
}

@Entity
@Table("player")
public class Player {
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    @ManyToOne(fetch=FetchType.LAZY, optional = false)
    @JoinColumn("team_id")
    Team team;

    @Column(nullable = false)
    String name;
    @Column(nullable = false)
    String position;
}
  

Для идентификатора используйте тип объекта Long. Во время сохранения идентификатор объекта равен нулю. После сохранения DB присвоит ему значение.

Комментарии:

1. Если это помогло отметить ответ как правильный, вот как работает stackoverflow.

Ответ №2:

JPA сопоставит внешний объект по его классу.

Попробуйте следующее:

 @Entity
public class Team {
    @Id @GeneratedValue long id;
    private String name;
}

@Entity
public class Player {
    @Id @GeneratedValue long id;
    Team teamId;
    String name;
    String position;
}