在Doctrine手册中,尽可能在Constrain关系下,它给出了"消除非必要关联"和"尽可能避免双向关联"的建议.我不明白什么标准会使协会"必不可少".
我之所以这么说,是因为看起来你经常想要从一对多关系的一方而不是多方方面.例如,我想获取所有用户的活动PhoneNumbers,而不是获取所有活动的PhoneNumbers及其关联的用户.当您必须遍历多个一对多关系时,这变得更加重要,例如,如果您希望在过去两天内看到所有具有MissedCall的用户(MissedCall-> PhoneNumber-> User).
这是简单情况下反向关联的外观:
SELECT * FROM User u
LEFT JOIN u.PhoneNumbers p WITH p.active
Run Code Online (Sandbox Code Playgroud)
如果有一种方法可以在DQL中以相反的方向跨越给定关系,那将会更加明智,如下面的原始SQL:
SELECT * FROM User u
LEFT JOIN PhoneNumber p ON p.User_id = u.id AND p.active
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么他们提出这个建议,在什么情况下值得忽略?
- 编辑 -
如果有缓解因素或其他解决方法,请给我简单的示例代码或链接.
当没有定义逆时,我没有看到任何方法来遍历关系的逆,所以我将假设构建自定义DQL 实际上不是一个解决方案 - 有一些与SQL 无关的连接是不可能的无论如何,DQL和水合作用可能都行不通.这就是为什么我不明白为什么添加反向关系是一个坏主意.
我正在将存储库模式实现为ASP.NET MVC站点的一部分.我见过的大多数关于存储库的例子都相当简单.例如,这是一个典型的抽象存储库接口.
public interface IRepository<TEntity>
{
IQueryable<TEntity> All();
TEntity FindBy(int id);
TEntity FindBy(Expression<Func<TEntity, bool>> expression);
IQueryable<TEntity> FilterBy(Expression<Func<TEntity, bool>> expression);
bool Add(TEntity entity);
bool Update(TEntity entity);
bool Delete(TEntity entity):
}
Run Code Online (Sandbox Code Playgroud)
我很清楚如何使用这样的存储库来添加,更新,删除或获取单一类型的实体.但是,您如何处理创建和操纵不同类型之间的一对多或多对多关系?
假设您有一个Item
类型,其中每个项目都分配给a Category
.您将如何通过存储库进行此分配?这应该取决于Update(Category c)
和/或Update(Item i)
方法来确定需要与正在更新的元素建立什么关系?或者应该有一个明确的AssignCategoryToItem(Item i, Category c)
方法?
如果它有任何区别我正在使用Fluent NHibernate来实现我的具体存储库.
asp.net-mvc many-to-many one-to-many fluent-nhibernate repository-pattern
我目前正在努力使用复合主键类的方案正确的映射注释.首先,我想用文字来实现:
我有2个类:group和FieldAccessRule.组可以有多个FieldAccessRules,而FieldAccessRule只有一个组分配.到目前为止,修改这个问题不是一个问题(简化):
public class Group{
...
@OneToMany(mappedBy = "group")
private Set<FieldAccessRule> fieldAccessRules;
...
}
Run Code Online (Sandbox Code Playgroud)
并为FieldAccessRule:
public class FieldAccessRule {
...
@ManyToOne
@JoinColumn(name = "group_id")
private Group group;
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我决定使用复合PK作为FieldAccessRule,因为规则对于ONE Group和ONE Field应该是唯一的.它看起来像这样:
@Embeddable
public class FieldAccessRulePK implements Serializable{
private String fieldKey;
private Group group;
...
}
Run Code Online (Sandbox Code Playgroud)
和ofc.FieldAccessRule需要更改为
public class FieldAccessRule {
...
@EmbeddedId
private FieldAccessRulePK fieldAccessRulePK;
...
}
Run Code Online (Sandbox Code Playgroud)
如何为Group的FieldAccessRuleSet创建正确的映射?这样做,我得到:
在属性"fieldAccessRules"中,"映射者"值"组"无法解析为目标实体上的>属性.
什么是创建从Group到PrimaryKey的PART的映射的正确方法?
编辑:我知道发现,使用
public class Group{
...
@OneToMany(mappedBy = "fieldAccessRolePK.group")
private Set<FieldAccessRule> fieldAccessRules;
...
}
Run Code Online (Sandbox Code Playgroud)
完全按预期工作.它编译得很好,它可以很好地创建数据库,并且在加载具有预定义角色的组之后,它们可以按预期使用.
但是,Eclipse仍然说
在属性"fieldAccessRules"中,"映射的"值"fieldAccessRulePK.group"无法解析为目标实体上的属性.
我不确定,如果忽略错误并且"假设"每一件事情都很好......(我发现一个帖子,据说已经说过,Hibernate支持模式attr1.attr2的映射但不支持JPA确认. )
我想实现一个具有自我依赖性的模型.假设实例People_A可能依赖于People_B和People_C.我首先使用多对多关键实现此模型.
class People(models.Model):
dependency = models. ManyToManyField ('self', blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
但结果是,如果People_A依赖People_B将导致People_B也依赖于People_A.这是我不想要的.
然后我用外键实现它.
class People(models.Model):
dependency = models.ForeignKey('self', blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
但这也行不通.如果People_A依赖People_B,那么其他任何人都不能依赖People_B.它将涵盖具有最新依赖性的旧依赖项.
任何线索都会感激不尽
我有一个带有修订的审计表,我想创建另一个与审计表修订版具有一对多关系的表.审计修订将指向新表数据.我怎样才能做到这一点?
我有三个表结构:tournament
,group
和team
.所述tournament
和group
表具有一个一对多关系,group
并team
具有一个对多关系如下所示.
我如何复制的价值tournament_id
,从group
表到group_tournament_id
的team
表?
我正在寻找一个使用create语句来实现这个目标的答案
create table team (
id serial primary key,
group_id int references group,
group_tournament_id int references group(tournament_id)
);
Run Code Online (Sandbox Code Playgroud)
当然这不起作用,因为为了引用它必须是唯一的东西,在这种情况下,tournament_id不是唯一的
当我插入团队时,我需要一种标准的方法来将tournament_id
from 的值复制group
到'team'表中group_tournament_id
group_id inside
table
编辑:不再需要在symfony中回答,只需postgreSQL即可
postgresql database-design one-to-many table-relationships postgresql-9.6
我正在使用PostgreSQL 9.5(但升级可以说是9.6).
我有权限表:
CREATE TABLE public.permissions
(
id integer NOT NULL DEFAULT nextval('permissions_id_seq'::regclass),
item_id integer NOT NULL,
item_type character varying NOT NULL,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
CONSTRAINT permissions_pkey PRIMARY KEY (id)
)
-- skipping indices declaration, but they would be present
-- on item_id, item_type
Run Code Online (Sandbox Code Playgroud)
3个表用于多对多关联
-companies_permissions(+指数声明)
CREATE TABLE public.companies_permissions
(
id integer NOT NULL DEFAULT nextval('companies_permissions_id_seq'::regclass),
company_id integer,
permission_id integer,
CONSTRAINT companies_permissions_pkey PRIMARY KEY (id),
CONSTRAINT fk_rails_462a923fa2 FOREIGN KEY …
Run Code Online (Sandbox Code Playgroud) sql database postgresql one-to-many polymorphic-associations
以下模型描述了漏洞以及引用该漏洞的Internet上的URL.假设每个URL只讨论1个漏洞,并且许多URL将讨论该漏洞.这是布局模型的正确方法吗?
class Vuln(models.Model):
pub_date = models.DateTimeField("Publication Date")
short_description = models.CharField("Description", max_length=70)
reference_urls = models.ForeignKey(Url, unique=True, blank=True, verbose_name="Reference URLs")
vendor = models.ForeignKey(Vendor, verbose_name="Vendor")
class Url(models.Model):
url = models.URLField("URL", max_length=200)
Run Code Online (Sandbox Code Playgroud)
Admin应用程序为参考URL提供了一个"选择"框,这不是我想要的.当我添加新的漏洞对象时,已输入的所有现有URL都显示在该下拉列表中,这又是不自然的.我觉得这应该与博客评论的方式非常相似,即.评论适用于单个博客条目,而不是其他任何一个博客条目可能有很多评论.我如何在Django模型中表达这一点?
我使用Spring Data,JPA,Hibernate和MySQL.事件和类别之间有一对多的关系.显然,一个事件只能有一个类别,一个类别可以分配许多事件.当我尝试删除Category时出现问题,如果任何事件持有此类别的外键,则会出现错误.我想在删除类别时将Event表中的外键设置为null.目前,我通过在删除Category之前将其更新为null,在代码中显式设置外键来更新所有事件.有没有办法在使用注释时这样做?
这是我的分类:
@Entity
@Table(name = "category")
public class Category implements Serializable{
@OneToMany(mappedBy="category", targetEntity=Event.class, fetch=FetchType.LAZY, cascade=
{CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
public Set<Event> getEvents_category() {
return events_category;
}
}
Run Code Online (Sandbox Code Playgroud)
和Event类:
@Entity
@Table(name = "event")
public class Event implements Serializable{
@ManyToOne(cascade={CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
CascadeType.REFRESH})
@JoinColumn(name="events_dancestyle")
public DanceStyle getDanceStyle() {
return danceStyle;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经看过很多次讨论这个话题,但我还没有看到任何解决方案.
我试图通过Symfony2(2.3.0)使用Doctrine(2.2.3+)在我的数据库中的对象上建立一些ManyToOne/OneToMany关系,并得到一个奇怪的错误.以下是对象的相关部分(一个产品的许多属性):
/**
* Product
*
* @ORM\Table(name="product")
* @ORM\Entity
*/
class Product
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
...
/**
*
* @OneToMany(targetEntity="ProductAttributes", mappedBy="product")
*/
protected $product_attributes;
public function __construct() {
$this->product_attributes = new \Doctrine\Common\Collections\ArrayCollection();
}
}
/**
* ProductAttributes
*
* @ORM\Table(name="product_attributes")
* @ORM\Entity
*/
class ProductAttributes
{
/**
* @var integer
*
* @ORM\Column(name="pa_id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $pa_id;
/**
* @var integer
*
* …
Run Code Online (Sandbox Code Playgroud) one-to-many ×10
django ×2
doctrine-orm ×2
hibernate ×2
jpa ×2
postgresql ×2
asp.net-mvc ×1
database ×1
doctrine ×1
dql ×1
embeddable ×1
many-to-many ×1
many-to-one ×1
model ×1
mysql ×1
python ×1
sql ×1
symfony ×1