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).
希望对您有所帮助!
我有一个 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).
希望对您有所帮助!