如何使用Entity Framework 4 Code First(POCO)声明一对一的关系?
我发现了这个问题(实体框架4中的一对一关系),但是答案引用的文章没有用(有一行代码是1-1关系,但没有提到如何定义它).
我正在努力获得与JPA(提供者:Hibernate)一起使用的单向一对一关系.在我看来,这不应该是一个麻烦,但显然JPA/Hibernate不同意这一点;-)
问题是我必须映射一个我无法更改的遗留模式,并且此模式在两个实体之间使用共享主键,同时它是一个实体的外键.
我创建了一个简单的TestCase:
DB如下所示:
CREATE TABLE PARENT (PARENT_ID Number primary key, Message varchar2(50));
CREATE TABLE CHILD (CHILD_ID Number primary key, Message varchar2(50),
CONSTRAINT FK_PARENT_ID FOREIGN KEY (CHILD_ID )REFERENCES PARENT (PARENT_ID));
CREATE SEQUENCE SEQ_PK_PARENT START WITH 1 INCREMENT BY 1 ORDER;
Run Code Online (Sandbox Code Playgroud)
父母(=一对一的拥有方)看起来如下:
@Entity
@Table(name = "PARENT")
public class Parent implements java.io.Serializable {
private Long parentId;
private String message;
private Child child;
@Id
@Column(name = "PARENT_ID", unique = true, nullable = false, precision = 22, scale = 0)
@SequenceGenerator(name="pk_sequence", sequenceName="SEQ_PK_PARENT")
@GeneratedValue(generator="pk_sequence", strategy=GenerationType.SEQUENCE) …Run Code Online (Sandbox Code Playgroud) 我们假设我们有以下模型.
class A(Model): pass
class B(Model): pass
Run Code Online (Sandbox Code Playgroud)
然后没有区别:
在模型A中: b = OneToOneField(B, related_name=A.__name__)
和
在模型B中: a = OneToOneField(A, related_name=B.__name__)
那么我应该问自己什么问题来决定是否将OTO放在一个或另一个模型中.我的意思是像has-a,is-a等等.
我有一个现有的数据库,里面有表Transactions.我添加了一个名为TransactionSequence的新表,其中每个事务最终只有一个记录.我们使用序列表来计算给定帐户的交易.我已将其映射为一对一映射,其中TransactionSequence具有TransactionId的主键.
约束是事务表上有一个而不是触发器,不允许更新已取消或已发布的事务.
因此,当计算序列并保存事务时,NHibernate会尝试发送事务更新,如'UPDATE Transaction SET TransactionId =?WHERE TransactionId =?'.但由于触发因此失败.如何配置我的映射,以便在插入新的TransactionSequence表时NHibernate不会尝试更新Transaction表?
交易映射:
<class name="Transaction" table="Transaction" dynamic-update="true" select-before-update="true">
<id name="Id" column="ID">
<generator class="native" />
</id>
<property name="TransactionTypeId" access="field.camelcase-underscore" />
<property name="TransactionStatusId" column="DebitDebitStatus" access="field.camelcase-underscore" />
<one-to-one name="Sequence" class="TransactionSequence" fetch="join"
lazy="false" constrained="false">
</one-to-one>
</class>
Run Code Online (Sandbox Code Playgroud)
和序列映射:
<class name="TransactionSequence" table="TransactionSequence" dynamic-update="true">
<id name="TransactionId" column="TransactionID" type="Int32">
<generator class="foreign">
<param name="property">Transaction</param>
</generator>
</id>
<version name="Version" column="Version" unsaved-value="-1" access="field.camelcase-underscore" />
<property name="SequenceNumber" not-null="true" />
<one-to-one name="Transaction"
class="Transaction"
constrained="true"
foreign-key="fk_Transaction_Sequence" />
</class>
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激...
当一个Entity映射到另一个在其子类上有直接实现的Entity时,我遇到了问题.请参阅以下示例映射:
@Entity
class Location {
@OneToOne
@JoinColumn(...)
private Person person;
}
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="person_type",discriminatorType=DiscriminatorType.STRING)
abstract class Person {
}
@Entity
@DiscriminatorValue("M")
class Man extends Person {
...
}
@Entity
@DiscriminatorValue("W")
class Woman extends Person {
...
}
Run Code Online (Sandbox Code Playgroud)
现在,这就是我在数据库表上的内容:
location-table:id = 1,person_id = 1 person-table:id = 1,person_type ="M"
当我使用实体管理器检索位置时,hibernate会抛出一个异常,说我无法实例化抽象类或接口.
Location location = entityManager.find(Location.class, 1L);
Run Code Online (Sandbox Code Playgroud)
Hibernate抛出此错误:
javax.persistence.PersistenceException: org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: Person
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:630)
at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:195)
at ......
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) …Run Code Online (Sandbox Code Playgroud) 使用Hibernate 5,Spring 4
请考虑以下代码和两个实体之间的映射:
用户类
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
private TruckOwner truckOwner;
Run Code Online (Sandbox Code Playgroud)
//下面的getter setters
TruckOwner类
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
Run Code Online (Sandbox Code Playgroud)
//下面的getter setter
当我的代码尝试更新user类中的值时,如下面的代码:
UserServiceImpl类
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void resetPassword(Long userId,String newPassword) {
User user = userDAO.findById(userId);
user.setPassword(newPassword);
System.out.println(user.getTruckOwner().getTruckOwnerId());
userDAO.merge(user);
}
Run Code Online (Sandbox Code Playgroud)
在调用时userDAO.merge(user);我得到以下错误:
非瞬态实体具有空id:com.mymodel.TruckOwner
我在项目的许多地方遇到这种问题,请帮我解决这个问题,为什么TruckOwner类的所有内容都由hibernate设置?
我有两个实体,具有以下JPA注释:
@Entity
@Table(name = "Owner")
public class Owner implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL)
@JoinColumn(name="Data_id")
private Data Data;
}
@Entity
@Table(name = "Data")
public class Data implements Serializable
{
@Id
private long id;
}
Run Code Online (Sandbox Code Playgroud)
所有者和数据具有一对一的映射,拥有者是所有者.执行时发生问题:owner.setData(null); ownerDao.update(所有者) ; "Owner"表的Data_id变为null,这是正确的.
但"数据"行不会自动删除.我必须编写另一个DataDao,并用另一个服务层来包装这两个动作(ownerDao.update(owner); dataDao.delete(data);)
当拥有的所有者将其设置为null时,是否可以自动删除数据行?
我有两个例子,第一个是@OneToOne单向映射和第二个双向映射.在单向映射中,拥有方表必须包含引用另一个表的id的连接列; 然后在双向中它们都必须包含彼此的外键列.但是在使用自动生成策略生成数据库模式之后,两个示例对数据库模式具有相同的效果.单向映射是正常的,但双向示例只包含一个外键列,但它必须涉及彼此的外键!
单向映射
@Entity
public class Customer43 {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
private String email;
private String phoneNumber;
@OneToOne
@JoinColumn(name = "address_fk")
private Address43 address;
// Getters, Setters and Constructors.
}
@Entity
public class Address43 {
@Id
@GeneratedValue
private Long id;
private String street1;
private String street2;
private String city;
private String state;
private String zipcode;
private String country;
// Getters, Setters and Constructors.
}
Run Code Online (Sandbox Code Playgroud)
双向映射
@Entity
public class Customer44 {
@Id
@GeneratedValue …Run Code Online (Sandbox Code Playgroud) 我相信我的问题的答案很简单,但我无法在任何地方找到它.这是我的困境.我有两个模型:Member和MemberDetail,它们是oneToOne关系,如下所示:
class Member(models.Model):
ID = models.AutoField(primary_key=True)
FIRST_NAME = models.CharField('First name', max_length=50)
LAST_NAME = models.CharField('Last name', max_length=50)
def __unicode__(self):
return u'%s %s' % (self.FIRST_NAME, self.LAST_NAME)
class MemberDetail(models.Model):
member = models.OneToOneField(Member, primary_key=True)
DATE_OF_BIRTH = models.DateField('Date of birth')
EMAIL = models.EmailField('E-mail')
PHONE = models.CharField('Phone', max_length=15)
Run Code Online (Sandbox Code Playgroud)
现在在我的admin.py中,我想要显示包含所有数据的成员表,如下所示:
class MemberDetailInline(admin.TabularInline):
model = MemberDetail
class MemberAdmin(admin.ModelAdmin):
list_display = ("FIRST_NAME", "LAST_NAME", "date_of_birth", "email", "phone")
inlines = [
MemberDetailInline,
]
admin.site.register(Member, MemberAdmin)
Run Code Online (Sandbox Code Playgroud)
我根本不知道怎么写list_display的"date_of_birth","email"和"phone"部分.我能做的最接近的事情是在内联后添加:
def date_of_birth(self, MemberDetail):
return MemberDetail.DATE_OF_BIRTH
def date_of_birth(self, MemberDetail):
return MemberDetail.EMAIL
def date_of_birth(self, MemberDetail):
return MemberDetail.PHONE …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过构建一个小型原型订单管理应用来学习Go和Gorm.数据库是MySQL.通过简单的查询,Gorm一直很出色.然而,当试图获得涉及一对多与一对一关系的组合的结果集时,Gorm似乎不足.毫无疑问,我缺乏理解实际上是在做空.我似乎无法找到任何我想要完成的在线示例.任何帮助将不胜感激.
去结构
// Order
type Order struct {
gorm.Model
Status string
OrderItems []OrderItem
}
// Order line item
type OrderItem struct {
gorm.Model
OrderID uint
ItemID uint
Item Item
Quantity int
}
// Product
type Item struct {
gorm.Model
ItemName string
Amount float32
}
Run Code Online (Sandbox Code Playgroud)
数据库表
orders
id | status
1 | pending
order_items
id | order_id | item_id | quantity
1 | 1 | 1 | 1
2 | 1 | 2 | 4
items
id | item_name | amount …Run Code Online (Sandbox Code Playgroud)