#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;
}