Java ORM 与多个实体

Java ORM vs multiple entities

我有一个 class Health Check - 作为 class 的一部分,我记录了观察到的寄生虫数量(枚举 NONE,一些,许多)以及寄生虫的位置(枚举 HEAD,FEET,BODY)。

有两种方法可以做到这一点:

方法一

健康检查

@Entity
public class HealthCheck {
    @Id
    @GeneratedValue(strategy = AUTO)
    private Long id;
    private Parasite parasite;

寄生虫

public class Parasite {
    private BodyLocation bodyLocation;
    private Coverage coverage;
}

或者我可以:

方法 2

@Entity
public class HealthCheck {
    @Id
    @GeneratedValue(strategy = AUTO)
    private Long id;
    private ParasiteNumber parasiteNumber;
    private ParasiteLocation parasiteLocation;

方法 1 是否需要寄生虫 class 上的 @Entity 以及每个 Health Check 和 @OneToOne 注释的 table 中的条目?

注意寄生虫 class 未在其他任何地方使用。它只是 Health Check.

的一部分

哪种方式正确?

一般来说,是的。在 ORM(又名 JPA 或 Hibernate)中,您正在构建表示数据库中事物的对象图。 @Entity 接触到的任何东西也是一个@Entity,因为它是一个图形。

是@OneToOne 还是@ManyToOne 等,取决于您的数据模型的性质。但是,请记住,这些连接也可以是@Lazy,因此只有在需要时才会加载它们。

因为@Lazy,方法 2 可能 是首选,idk。我假设 ParasiteLocation 和 ParasiteNumber 是某种 join-table。如果是这种情况,您可以使用其 PL 和 PN 加载 HealthCheck,但这些对象可能对 Parasite 来说是惰性的。

我认为您的问题没有 one-size-fits-all 答案。这在很大程度上取决于。但好消息是,ORM 可以灵活地涵盖 any/all 你可能遇到的场景。

如果Parasite只用在HealthCheck中class,可以看成是关联。 关联意味着子 class 的存在依赖于父的存在,因此它没有独立的生命周期,因此您可以像在第二个示例中那样直接在 HealthCheck 中声明属性,或者您可以声明它们在 Parasite class 中,然后使其可嵌入到 HealthCheck class 中,例如:

/*To embed a class inside in Entity you must declare it Embeddable via the JPA 
annotation @Embeddable */
@Embeddable
public class Parasite {
@Column(name="body_location")
private BodyLocation bodyLocation;
@Column(name="coverage")
private Coverage coverage;

}

@Entity
public class HealthCheck {
@Id
@GeneratedValue(strategy = AUTO)
private Long id;

@Embedded
private Parasite parasite;
}

这里您的 HealthCheck 数据库 table 将具有寄生虫 class 中指定的属性,请注意寄生虫 table 不会被创建,因为它是嵌入式的而不是实体(@Entity).

希望对您有所帮助!