我的问题是关于实现高内聚,但我认为下一个例子促进了低内聚和高耦合,如果是这种情况,我会有人解释我,我说的是在我的任何项目中都非常常见的打包策略工作过 这个例子通常带有一些不好的习惯,我们的接口和实现都是公开的,我们还需要将字段暴露给 get 和 set 以管理状态(这有时会导致在其他类中通过验证 ...
提示:本站收集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实体之间进行选择。 经过大量阅读之后,我仍然不知道对数据库性能的影响是否足够严重,不足以证明编写等同于紧密耦合,严格且最终不良代码的内容是合理的。
设计原则中似乎存在矛盾的解决方法/解决方案吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.