繁体   English   中英

尝试实现JPA实体之间的低耦合

Attempting achieve low coupling between JPA entities

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我遇到的一个问题是在不牺牲SOLID原则的情况下映射与JPA / Hibernate一对多关系的一种好方法。 这是我正在处理的当前项目中的此问题的示例:

给定以下代码,该代码定义了单向一对多关系:

@Entity
@Table(name = "users")
public class User extends AggregateEntity<User> implements HasRoles, HasContactInfo, HasContacts, HasDeals {

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
    @JoinColumn(name = "fk_hasContacts")
    private Set<Contact> contacts;}

我的理解是,这将在“联系人”表中创建“ fk_hasContacts”列,而无需“ Contact”类知道或关心它是从哪个对象引用的。 另外,请注意“用户”如何实现“ hasContacts”接口,该接口在两个实体之间产生去耦效果。 如果明天我想再上一堂课; 说“ BusinessEntity”(也有联系人),则在当前代码中无需更改任何内容。 但是,在阅读了该主题之后,从数据库性能的角度来看,这种方法似乎效率很低。

映射@OneToMany关联关系的最佳方法是依靠@ManyToOne端传播所有实体状态更改-如此处所述

似乎是普遍的智慧。 如果以这种方式进行设计,那么“ User”类现在将如下所示:

@Entity
@Table(name = "users")
public class User extends AggregateEntity<User> implements HasRoles, HasContactInfo, HasContacts, HasDeals {

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private Set<Contact> contacts;

并且(以前已分离)的“ Contact”类现在必须看起来像这样:

@Entity
@Table(name = "contacts")
public class Contact extends StandardEntity<Contact> {

    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "fk_user")
    private User user;

关键的问题是,从这里开始 ,JPA似乎不支持将接口定义为实体属性。 所以这段代码:

@Entity
@Table(name = "contacts")
public class Contact extends StandardEntity<Contact> {

    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "fk_user")
    private HasContacts hasContacts;//some class which implements the "HasUser" interface

不是一个选择。 似乎必须在SOLID OOP和有效的ORM实体之间进行选择。 经过大量阅读之后,我仍然不知道对数据库性能的影响是否足够严重,不足以证明编写等同于紧密耦合,严格且最终不良代码的内容是合理的。

设计原则中似乎存在矛盾的解决方法/解决方案吗?

问题暂未有回复.您可以查看右边的相关问题.
1 使用哪种封装策略实现高内聚低耦合

我的问题是关于实现高内聚,但我认为下一个例子促进了低内聚和高耦合,如果是这种情况,我会有人解释我,我说的是在我的任何项目中都非常常见的打包策略工作过 这个例子通常带有一些不好的习惯,我们的接口和实现都是公开的,我们还需要将字段暴露给 get 和 set 以管理状态(这有时会导致在其他类中通过验证 ...

2 JPA中实体之间的引用

我的应用程序中有一个Question实体和一个QuestionCategory实体。 在数据库中,这是一个多对多关系。 我可能需要一些帮助。 我是否应该在引用QuestionCategory和Visa Verca的Question中创建List引用? 然后,JPA可以根据您从哪个实体 ...

3 如何实现JDBC驱动程序和源代码之间的松散耦合?

我不想使我的代码与某些JDBC驱动程序(例如MySql)紧密耦合。 我想制作通用代码,可以与许多数据库实现一起使用。 而且我不太了解在使用JDBC时如何实现此目标。 我认为要实现此目的,我只需要将驱动程序类名称(和连接字符串)导出到.properties文件(例如"com.mysql. ...

4 实体与 JPA 之间的链接

我正在创建一个 Java Web 应用程序,对于后端,我使用 JPA 和一个 h2 数据库。 目前我有一个叫做 Secteur 的类和一个叫做 Bassin 的类。 在我看来,一个Secteur可以有很多Bassin,但是一个Bassin只能有一个Secteur。 此外,如果尚未创建 Secteur ...

5 低耦合和SQL连接

假设我有一个表格people (id, firstname, lastname) 。 还有两个其他表应包含这些字段,因此我们仅重用人员表: users (id, username, person_id)和users (id, username, person_id) companies ( ...

6 低耦合和紧密的内聚力

当然这取决于具体情况。 但是当较低级别的对象或系统与更高级别的系统进行通信时,是否应优先使用回调或事件来保持指向更高级别对象的指针? 例如,如果我们正在开发游戏,我们有一个world class的成员变量vector&lt;monster&gt; monsters 。 当monster ...

8 JPA @JoinColumn和实体之间的关系

在此示例中,来自https://docs.oracle.com/javaee/7/tutorial/persistence-criteria002.htm 我对此有两个问题: 1)为什么在@ManyToOne下面没有@JoinColumn批注? 2)为什么@ManyToOne ...

9 减少实体中的耦合

我正在寻找一种适当的方法来减少我为Symfony2框架编写的消息传递包中的耦合,以便我可以在应用程序之间轻松使用它。 Message实体的每个实例都应该有一个发件人和一个收件人, instanceof Symfony\\Component\\Security\\Core\\User\\Us ...

10 在内存或 GC 不足时自动分离 JPA 实体

是否可以在 Hibernate/Spring 中自动分离 JPA 实体并在需要时重新附加它,或者规范不允许这样做。 目前在我的代码中,当我进行一些批处理时,我会执行以下操作 应该有一种情况可以检测到可能通过 equals/hashCode 对实体进行的修改确实抛出 ModifiedExerna ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM