这个问题最初是错误的,请参阅下面的编辑.我会把它留给上下文.
我一直在考虑建立双向(即一对一)映射的智能方法.映射函数A-> B(多对一)基本上是HashMap(A,B)的作用.如果我现在想要一个与O(1)中的contains()实现一对一的数据结构,那么我可以使用java标准库中的某些东西吗?请注意,我现在不需要这个,这只是我最近想到的,无法提供数据结构,所以答案并不急.有类似的课吗?如果没有,您认为为什么会这样?
我所能找到的就是关于冬眠的事情,这对我没有任何帮助.
编辑:我的问题是措辞不好,所以一些解释是应该的.
我的意思是"向后"映射B-> A. HashMap(A,B)在O(1)中包含(A)和包含(B),所以这甚至不是我的意思,对于混淆感到抱歉.我的意思是,是否有一个数据结构映射A < - > B在O(1)中有getValue(A)和getKey(B)?
我意识到这可以通过维护包含相同关系的两个HashMaps(A,B)和(B,A)来完成,但我觉得应该有一个数据结构来处理它而不必"手动"执行.
我工作于Django 2.0
我有一个Note用于保存笔记的模型,还有另外两个模型用于向笔记添加颜色标签。
class Note(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=250, blank=True, default='Untitled')
content = models.TextField(blank=True)
class ColorLabels(models.Model):
title = models.CharField(max_length=100, unique=True)
value = models.CharField(max_length=100)
default = models.BooleanField(default=False)
class NoteLabel(models.Model):
note = models.OneToOneField(Note, on_delete=models.CASCADE)
color_label = models.OneToOneField(ColorLabels, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
与对象Note
note = Note.objects.get(pk=1)
Run Code Online (Sandbox Code Playgroud)
我想访问关联的ColorLabels和title字段value或NoteLabel对象。
因为它们是一对一的字段。我尝试做
note.note_label
note.NoteLabel
note.note_label_set
Run Code Online (Sandbox Code Playgroud)
但所有返回错误为
AttributeError: 'Note' object has no attribute 'note_label_set'
Run Code Online (Sandbox Code Playgroud) 我有一个按ISBN号映射的Book模型和Inventory模型,但ISBN不是其中的主键.书籍属于Bookstores,而Inventory是针对一组书店(BookstoreChain).库存由属于BookstoreChain的所有书店共享.
我正在书侧使用Hibernate @OneToOne映射来加入ISBN列来获取库存信息.不知何故,Hibernate正确生成左外连接查询,但库对象上的库存为空.它也不是懒惰的.忽略书店和连锁店,如何在提取书籍时进行OneToOne或ManyToOne连接并获取库存?
class Book{
@Id
Long id
@Column
String isbn;
@Column
String title;
@OneToOne(optional = true)
@JoinColumn(name = "isbn", referencedColumnName = "isbn",insertable = false, updatable = false)
Inventory inventory;
}
class Inventory{
@Id
Long id
@Column
String chainId
@Column
String isbn
@Column
Long availableQty
}
Run Code Online (Sandbox Code Playgroud) 这是NHibernate中单向一对一映射的问题.
public class Student
{
public int ID { get; set; }
public int Roll { get; set; }
public int RegNo { get; set; }
public string Name { get; set; }
public StudentDetail StudentDetail { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
public class StudentDetail
{
public int ID { get; set; }
public string Father { get; set; }
public string Mother { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何将这些类(hbm映射文件的外观如何)映射到以下一对一关系的情况?

请仔细查看课程和表格.
我在哪里可以把<many-to-one>标签中Student.hbm.xml还是StudentDetail.hbm.xml?如果我把它插入Student.hbm.xml,我怎么能映射列 …
我正在尝试在Doctrine中创建一个可选的OneToOne映射.
我有一个包含所有城市和邮政编码的表格(此表格不应更改),我有一张包含地址和映射城市的表格.但有时候我不想在开始时将城市添加到我的地址(可能稍后就会).但是当我没有向地址添加城市时,地址上的持久性会给我一个反射异常,因为没有像'null'这样的对象,它应该是de City对象.
我不希望每次都将空城添加到数据库中,因为不应该向城市表添加或删除任何内容.
有什么建议?或者我错过了什么?
class Address{
/**
* @OneToOne(targetEntity="City")
* @JoinColumn(name="city_id", referencedColumnName="id")
*/
private $city = '';
Run Code Online (Sandbox Code Playgroud)
我考虑的可能解决方案
我创建了以下表格:
动漫(id,标题,日期),漫画(id,标题,日期),TVSeries(id,title,season,episode,date)
他们中的一些人已经拥有导演,流派,文章等的外键(一对多或多对多的关系).
现在我想再创建两个表评论(id,评级,日期)和帖子(id,thumbid,articleid,reviewid).评论是关于一个动漫和/或漫画TVSerie,反之亦然,但评论的属性可能在多个表中.关于帖子也一样.
这是单独表中一对一关系的典型示例,还是更有效地向现有表添加更多属性?所以更多的表和关系或更少的表更多列?
谢谢你,我希望我的问题不是那么愚蠢,但我有点困惑.
我设置了一个oneToOne关系时有两个表.Bill和BillSimpleEntry.(每个Bill都有一个BillSimpleEntry
这是他们的结构
CREATE TABLE `bill` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
..
..
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
KEY `fk_bill_groups1_idx` (`groupId`),
KEY `fk_bill_user1_idx` (`billPayerId`),
CONSTRAINT `fk_b...` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON D ELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_b...` FOREIGN KEY (`billPayerId`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `billsimpleentry`;
/*!40101 SET @saved_cs_client = @@character_set_client …Run Code Online (Sandbox Code Playgroud) 我实际上是在尝试使用 JPA@OneToOne注释将Child实体链接到它的Parent.
它运行良好,除了在获取Childs列表时,JPA 引擎(在本例中为 Hibernate)进行 1+n 次查询。
这是 Hibernate 查询的日志:
select child0_.id as id1_0_, child0_.parent as parent3_0_, child0_.value as value2_0_ from child child0_
select parent0_.id as id1_1_0_, parent0_.something as somethin2_1_0_ from parent parent0_ where parent0_.id=?
select parent0_.id as id1_1_0_, parent0_.something as somethin2_1_0_ from parent parent0_ where parent0_.id=?
select parent0_.id as id1_1_0_, parent0_.something as somethin2_1_0_ from parent parent0_ where parent0_.id=?
Run Code Online (Sandbox Code Playgroud)
使用完全相同的实体定义,特别是当我得到一个孩子时,JPA 使用预期的 JOIN 执行查询:
select child0_.id as id1_0_0_, child0_.parent as parent3_0_0_, child0_.value as …Run Code Online (Sandbox Code Playgroud) 我的模型中有以下两个类:
class Answer(models.Model):
answer = models.CharField(max_length=300)
question = models.ForeignKey('Question', on_delete=models.CASCADE)
def __str__(self):
return "{0}, view: {1}".format(self.answer, self.answer_number)
class Vote(models.Model):
answer = models.OneToOneField(Answer, related_name="votes", on_delete=models.CASCADE)
users = models.ManyToManyField(User)
def __str__(self):
return str(self.answer.answer)[:30]
Run Code Online (Sandbox Code Playgroud)
在外壳中我采取第一个答案:
>>> Answer.objects.all()[0]
<Answer: choix 1 , view: 0>
Run Code Online (Sandbox Code Playgroud)
我想获得 Vote 对象:
>>> Answer.objects.all()[0].votes
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\Hippolyte\AppData\Roaming\Python\Python38\site-packages\django\db\models\fields\related_descriptors.py", line 420, in __get__
raise self.RelatedObjectDoesNotExist(
questions.models.Answer.votes.RelatedObjectDoesNotExist: Answer has no votes.
Run Code Online (Sandbox Code Playgroud)
但发生了错误。
我不明白为什么related_name不被识别。你可以帮帮我吗 ?
one-to-one ×10
django ×3
hibernate ×3
orm ×3
python ×3
java ×2
jpa ×2
mapping ×2
activerecord ×1
contains ×1
database ×1
doctrine ×1
models ×1
mysql ×1
nhibernate ×1
performance ×1