这个错误在过去的4个小时里一直在破坏我.
此外,当我交换它并获得用户数据时,然后消息数据... User.name将显示,但Message.message不会.所以数据肯定会进入,但它们之间的关系似乎被打破了.
我有两个简单的表"items"和"orders".为简单起见,我们假设一个项目只能在一个订单中,或者一个订单只能包含一个项目.
现在,因为这可以使用简单的一对一关系实现,我可以执行以下操作:
我可以将orders表的主键添加到items表中,如下所示
//Table Items
item_id, item_name, order_id
1, shoes, 1
2, watch, 2
//Table Orders
order_id, customer
1, James
2, Rick
Run Code Online (Sandbox Code Playgroud)
或者我可以将items表的主键添加到orders表中,如下所示
//Table Items
item_id, item_name
1, shoes
2, watch
//Table Orders
order_id, customer, item_id
1, James, 1
2, Rick, 2
Run Code Online (Sandbox Code Playgroud)
哪一个是正确的,为什么?是否有任何指导线来决定哪个键在哪里?当然,常识会在上面的简单例子中起作用,但在复杂的例子中我们如何决定?
mysql database database-design entity-relationship one-to-one
我有2张桌子:Order [OrderId(PK), OrderShipmentCode, ...]和Shipment[ShipmentId(PK), ShipmentCode, ...].
在Order课堂上,我声明shipment了如下字段:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OrderShipmentCode", referencedColumnName = "ShipmentCode", insertable = false, updatable = false, nullable = false)
private Shipment shipment;
Run Code Online (Sandbox Code Playgroud)
当我得到列表时Order,Shipment也会加载(我看到很多单独的SELECT查询).但是我希望它Shipment是懒惰的,而不是与它一起提取Order.
对于其他表,如果引用的列是主键,则结果与预期一致(使用延迟加载).在我的情况下,ShipmentCode不是Shipment表的主键,并且Hibernate不使用延迟加载.
你能告诉我如何实现这个目标吗?
编辑: 查询代码如下:
Criteria criteria = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(Order.class);
List result = criteria.list();
Run Code Online (Sandbox Code Playgroud)
SQL查询是:1 Order表的SELECT语句和一堆SELECT语句Shipment
如何在hibernate hbm文件中创建可选的一对一映射?例如,假设我有一个User和一个last_visited_page表.用户可能有也可能没有last_visited页面.这是我在hbm文件中的当前一对一映射:
用户类:
<one-to-one name="lastVisitedPage" class="LastVisitedPage" cascade="save-update">
Run Code Online (Sandbox Code Playgroud)
LastVisitedPage类:
<one-to-one name="user" class="user" constrained="true" />
Run Code Online (Sandbox Code Playgroud)
上面的示例不允许创建没有最后访问过的页面的用户.新创建的用户尚未访问过任何页面.如何更改hbm映射以使userPrefs映射可选?
我上下打量,尝试了所有不同的方法,能够将AspNetUser表的外键存储在一个单独的Customer表中.我还是ASP.NET和实体框架的新手,但我已经阅读了不少帖子和文档.
目前这就是我所拥有的
楷模
public class Customer
{
[Display (Name="Customer ID")]
public int CustomerID { get; set; }
public string UserId { get; set; }
[ForeignKey("UserId")]
public virtual ApplicationUser ApplicationUser { get; set; }
}
public class ApplicationUser : IdentityUser
{
public virtual Customer Customer { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<Customer> Customers { get; set; }
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Run Code Online (Sandbox Code Playgroud)
我引用了这个错误
无法确定类型"TestApplication.Models.Customer"和"TestApplication.Models.ApplicationUser"之间关联的主要结尾.必须使用关系流畅API或数据注释显式配置此关联的主要结尾.
我也试过这个人的方法:必须使用关系流畅的API或数据注释显式配置此关联的主要结尾
所以我注释掉了ForeignKey注释并使用了人的建议,使用了"modelBuilder"方法.当我更新我的数据库时,AspNetUsers表中的'Id'在Customers表中(这很好),但CustomerID作为ForeignKey也在AspNetUsers表中,这不是我想要的.
我想要的是AspNetUsers的'Id'作为ForeignKey在Customers表中.
我需要两个实体之间的链接,所以我使用一对一
@Entity
@Table(name = "T_USER")
public class User implements Serializable {
@Id
@Column(name = "user_id")
private int userId;
@Column(name = "login")
private String login;
@OneToOne(optional = true)
@JoinColumn(name="login", referencedColumnName="person_id", nullable = true, insertable = false, updatable = false)
private Person person;
}
@Entity
@Table(name = "T_PERSON")
public class Person implements Serializable {
@Id
@Column(name = "person_id")
private String personId;
@Column(name = "pin")
private String pin;
}
Run Code Online (Sandbox Code Playgroud)
如果表T_USER中没有特定PERSON的项,user.getPerson会抛出异常:
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [packagename.com.entity.Person#scabriou]
Run Code Online (Sandbox Code Playgroud)
但是如果我在db中的两个表之间有引用,那么getter就可以了!
现在我正在使用django 1.6
我有两个模型涉及一个OneToOneField.
class A(models.Model):
pass
class B(models.Model):
ref_a = models.OneToOneField(related_name='ref_b', null=True)
Run Code Online (Sandbox Code Playgroud)
首先看我指出问题的代码:
a1 = A.objects.create()
a2 = A.objects.create()
b1 = B.objects.create()
b2 = B.objects.create(ref_a=a2)
# then I call:
print(a1.ref_b) # DoesNotExist Exception raised
print(a2.ref_b) # returns b2
print(b1.ref_a) # returns None
print(b2.ref_a) # returns a2
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如果我想检查一个A对象,判断它是否存在B引用它的对象.我能怎么做?
我尝试的有效方法只是尝试捕获异常,但还有其他更漂亮的方法吗?
我的努力:
1 - 以下代码有效,但太难看了!
b = None
try:
b = a.ref_b
except:
pass
Run Code Online (Sandbox Code Playgroud)
2 - 我也尝试检查a中的属性,但不工作:
b = a.ref_b if hasattr(a, 'ref_b') else None
Run Code Online (Sandbox Code Playgroud)
朋友们,你遇到同样的问题吗?请指点我,谢谢!
考虑以下型号:
@Entity
public class User {
@Id
@Column(name = "USER_ID")
private Long userId;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@OneToOne
@PrimaryKeyJoinColumn
private UserExt userExt;
... //getters and setters
}
@Entity
public class UserExt {
@Id
@Column(name="USER_ID")
private Long id;
private String cdpId;
private Date lastChanged;
... //getters and setters
}
Run Code Online (Sandbox Code Playgroud)
执行时:
Query query = session.createQuery("from User");
List<User> list = query.list();
Run Code Online (Sandbox Code Playgroud)
Hibernate执行
Hibernate: select user0_.USER_ID as USER1_0_, user0_.FIRST_NAME as FIRST2_0_, user0_.LAST_NAME as LAST3_0_, user0_.EXT_USERNAME as …Run Code Online (Sandbox Code Playgroud) 我的代码如下:
@Entity
@Table(name = "A")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class A
{
@OneToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER, mappedBy="a")
public B getB() {};
}
@Entity
@Table(name = "B")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class B
{
@OneToOne(cascade={}, fetch=FetchType.LAZY)
@JoinColumn(name="A_ID")
public A getA() {};
}
Run Code Online (Sandbox Code Playgroud)
每次A加载时都有查询B.为什么加载A.getB()后没有缓存,A是否可以缓存它?
我有300多个班级.它们在某些方面有关系.
为简单起见,所有关系均为1:1.
这是一个示例图.
注意:对于某些情况,某些关系可能不存在.
例如,某些hen与任何内容无关food.
注2:没有链接=从不,例如每个egg都与任何相关cage.
永远不会添加/删除/查询这种关系.
如何优雅地存储它们之间的关系?
我的所有4个想法(下面)似乎都有缺点.
这是一个相关的问题,但是1:N只有1个关系.
这些是半伪代码.
我的第一个想法是互相添加指针.
Chick.h: -
class Egg;
class Food;
class Chick{ Egg* egg; Food* food;}
Run Code Online (Sandbox Code Playgroud)
Hen.h: -
class Egg; class Cage; class Food;
class Hen{ Egg* egg; Cage* cage; Food* food;}
Run Code Online (Sandbox Code Playgroud)
添加/删除关系和查询非常便宜,例如: -
int main(){
Hen* hen; ... Egg* egg=hen->egg;
}
Run Code Online (Sandbox Code Playgroud)
它运作良好,但随着我的程序的增长,我想要将它们分离.
粗略地说,Hen.h不应该包含单词Egg,反之亦然.
有很多想法,但似乎都没有.
我将展示每个解决方案的简短片段,然后总结问题末尾的利弊.
使用std::unordered_map.
它成为我程序的瓶颈.(在发布模式下配置)
class Egg{}; …Run Code Online (Sandbox Code Playgroud)