Java Spring\JPA\PostgreSQL:为什么我得到一个我没有创建的表?

Java Spring\JPA\PostgreSQL:为什么我得到一个我没有创建的表?,java,spring,postgresql,spring-boot,jpa,Java,Spring,Postgresql,Spring Boot,Jpa,我第一次做了一个弹簧靴。 我使用的是Spring boot版本2.3.4。 我也使用PostgreSQL。 我想创建两个表:Player和Team。 球队应该有一份球员名单 因此,我创建了下面两个实体类: @Entity @Table(name = "Players") public class Player { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name=

我第一次做了一个弹簧靴。 我使用的是Spring boot版本2.3.4。 我也使用PostgreSQL。 我想创建两个表:Player和Team。 球队应该有一份球员名单

因此,我创建了下面两个实体类:

@Entity
@Table(name = "Players")
public class Player {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="player_id")
    private Long playerId;
    
    private String name;
    
    private int dateOfBirth;
    
    private String originCountry;
    
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "team_id", referencedColumnName = "team_id")
    private Team team;
}

您可能已经知道,SpringBoot会自动创建表。 团队表没有“玩家”列的问题

这里怎么了? 也许我不需要查看团队表中的“球员”列?这对我来说很奇怪。。。 有没有更好的方法来定义值列表或数组

另外,我想了解:@JoinColumnname=team_id是否定义了球员的球队属性private team team的列名


谢谢

我认为您在考虑对象关系映射ORM时混淆了两个不同的概念。请记住,您正在使用JPA,并且在幕后使用Hibernate。一件事是Java应用程序的对象,另一件事是您拥有的表集,例如,仅考虑多对多关系。您可以使用2个对象轻松映射它:

班级比赛{ ... 私人团队; ... } 班队{ ... 私有集匹配; ... } 这是两个物体的多对多合成。但如何将其映射到规范化的关系数据库上呢?在这种情况下,您需要一个连接表,因此您将有两个表加上一个team_match表,该表将只有team的id和match的id,并且这两个字段将是唯一的约束。因此,当您想要获取信息时,将使用联接,如下所示:

从团队t中选择t.*m.* 在t.id=tm.team\u id上加入team\u match tm 在m.id=tm.match\u id上加入匹配m 所发生的是,框架(在本例中为Hibernate)将所有这些抽象化,并将对象转换为表。而且,有时,一个表中不会有一个对象

考虑到这一点,考虑到关系数据库,您总是需要那个额外的表。您可以在Postgres中使用jsonb类型来实现这一点,但我不推荐在这种情况下使用,因此我将不再详细介绍它。尽管如此,我建议您深入阅读ORM对象关系映射,以便更好地理解幕后会发生什么。希望答案能帮助你

编辑:

好的,对不起,你的评论让我意识到我可以告诉你实现这一目标的方法。因此,最规范的方法是这样:

@实体 班队 { @身份证 @GeneratedValuestrategy=GenerationType.AUTO @Columnname=团队id 私人长teamId; // ... @onetomanaymappedby=team,fetch=LAZY,cascade=ALL 私人名单玩家; // ... } @实体 类PlayerId{ @身份证 @GeneratedValuestrategy=GenerationType.AUTO @Columnname=player\u id 私人长玩家ID; @manytonefetch=懒惰 @JoinColumnname=团队id,ReferenceColumnName=团队id 私人团队; // ... } 请注意,@OneToMany注释引用在目标实体中组成的对象。希望能有帮助

编辑2:


关于@JoinColumn:name是当前表/实体中的联接列,referencedColumnName是外部表/实体中的联接列。

@ElementCollection注释(如果指示)由集合表映射。请参阅文档:@blurfus Right。但是删除注释并没有改变任何事情。数据库表已经创建了。如果它不存在,它将在第一次创建它-您需要自己从数据库中删除该表。请让我知道这是否对您有效:@blurfus谢谢您的耐心。这没有帮助。我也尝试过使用OneToMany注释,正如你在问题中看到的那样,但得到了类似的结果。谢谢!真的应该这么间接吗?我所需要的只是一个表对象,它包含其他对象的列表,也包括映射到表的实体。我不认为解决方案应该如此曲折。。。我很高兴知道你将如何实施它。一队队员。团队存储在团队表中,球员技能存储在球员id表中。非常感谢!嗯,我想我的答案漏掉了,对吧?我正在编辑它,并将添加它。因为一对一关系不需要连接表。对不起,我错过了。谢谢。referencedColumnName的值id是什么?是球员id还是球队id?我对上面的代码做了一些更新。你能检查一下我做错了什么吗?好吧,Javadocs解释得比我好,所以:可选这个外键列引用的列的名称。详情如下:
@Entity
@Table(name = "Teams")
public class Team{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="team_id")
    private Long teamId;
    
    private String name;
    
    private String country;

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

}