【问题标题】:Creating entity for database为数据库创建实体
【发布时间】:2020-04-03 05:54:12
【问题描述】:

例如,我有一个带有表书(id,title,themeId,authorId),表作者(id,name)和表主题(id,name)的数据库。我不知道,我是否应该像在数据库中一样创建实体(然后我会遇到连接查询问题):

class Book {
    private id;
    String title;
    int bookThemeId;
    int bookAuthorId;
}

或创建类似的东西:

class Book {
    private id;
    String title;
    BookTheme bookTheme;
    Author bookAuthor;
}

在第二种情况下,如果 authorId 或 themeId 为空(可能是),如果我只想获取书籍列表(问题 - 字段为空,并且对于 Book 的构建器非常庞大),从 DAO 获取一般会出现问题实体)。

【问题讨论】:

  • 第二个选项将排除具有多个主题和作者的书籍。
  • @P.Salmon 目前没什么大不了的,它只是一个例子

标签: java mysql sql database


【解决方案1】:

我会选择第二个选项,因为它更面向对象。如果您选择第一个选项,则需要进行第二次查询以获取详细信息。

@Entity
@Table(name = "books")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    //... 

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "theme_id", referencedColumnName = "id")
    private BookTheme bookTheme;

    // ... getters and setters
}

当未创建字段时,您的 id 将为空,对吗? 例如,当它保存在数据库中时,它总是有一个 id。

【讨论】:

  • 感谢您的回答,是的,我也喜欢第二种选择,但我暂时不使用注释和 JPA 来学习 servlet,所以我不明白您使用注释的确切含义。关于 ids - 我的意思是外来 id,比如 themeId,它可能为 null,所以我们可以在使用第二个选项中的实体时捕获 NullPointerException。
  • 我不会捕获 NullPointException 而只是检查变量是否为空。它更干净。
  • 好的,我认为 null 检查低价以便于实体使用
【解决方案2】:

我认为你应该采用第二种方法。如果您使用 optional=true,您的 BookTheme r Author 将为空,则不会有任何问题。对于笨重的构建器,您可以使用fetchtype as lazy

@Entity
@Table(name = "Book")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional=true)
    @JoinColumn(name = "theme_id", referencedColumnName = "id")
    private BookTheme bookTheme;

    // ... getters and setters
}

希望,这会奏效!

【讨论】:

  • 谢谢你的回答,我明白了,但我不使用注释和 JPA。
  • 如果你不使用那个,那么你应该使用第一种方法
  • 如果我不使用注释,我为什么要选择第一个选项?
  • 如果你选择第二个选项,那么它会很笨重。在第一个选项中,如果您使用原始的 thn,您可以处理 null 的事情,也可以只获取 id 而不是整个对象。
猜你喜欢
  • 2021-04-14
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 2016-03-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多