我有两个例子,第一个是@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) 我有实体A有一个B实体,而B有一个带有@OneToOne双向关联的A.
现在,当我找到所有A记录时,hibernate在B上执行左外连接的两个查询,如下所示:
select a.id, a.id_b, a.field1, b.id, b.field1 from A as a, B as b left outer join b ON b.id=a.id_b;
select a.id, a.id_b, a.field1, b.id, b.field1 from A as a, B as b left outer join b ON b.id=a.id_b WHERE b.id=?
Run Code Online (Sandbox Code Playgroud)
首先查询加载A和B字段,这没关系,但为什么要执行第二次查询来重新加载A?我认为这个查询加载了B中的A内容,但是这个A显然是包含B的A ......所以它已经加载了第一个查询,是不是真的?
- 编辑 -
实体A:
@Entity
public class A implements Serializable{
// id and other ecc ecc
@OneToOne
@JoinColumn(name="id_b")
B b;
}
Run Code Online (Sandbox Code Playgroud)
实体B:
@Entity
public class B implements Serializable{
// id and other ecc ecc
@OneToOne(mappedBy="b")
A …Run Code Online (Sandbox Code Playgroud) 我有2个类:User和UserPicture,它们之间有1:1的关系.
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", nullable = false, unique = true)
private int id;
private String firstname;
private String lastname;
@OneToOne
@JoinColumn(name = "picture") //field named "picture" in the database
private UserPicture userPicture;
..
}
public class UserPicture {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", nullable = false, unique = true)
private int id;
private Blob image;
@OneToOne
@JoinColumn(name = "user")
User user;
Run Code Online (Sandbox Code Playgroud)
UserPicture中的'user'将被加载,但User中的'userPicture'不会 - 我错了什么?
编辑 必须添加我只是创建一个UserPicture并插入它们(使用现有的userId) - 也许我需要在UserPicture级联'用户'?
在遗留系统中,我们有1个表(实体)和1个视图(UserDetail),没有约束但有关系.
Entity
| Id | Desc | Created_By |...
UserDetail
| UserId | F_Name | L_Name |...
Run Code Online (Sandbox Code Playgroud)
CreatedBy具有创建该实体的用户的用户标识.我们在Entity.java中有一个单向映射,如下所示.
@OneToOne
@JoinColumn(name = "CREATED_BY", referencedColumnName = "USER_ID")
private UserDetail createdBy;
Run Code Online (Sandbox Code Playgroud)
问题
但由于它是一个遗留系统,我们无法控制它并且用户被硬删除.
调用entityReposity.findAll时,将引发以下错误
org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find com...UserDetail with id 92237; nested exception is javax.persistence.EntityNotFoundException: Unable to find com...UserDetail with id 92237
Run Code Online (Sandbox Code Playgroud)
题
如何让JPA认为这种关联是可选的,或者在JPA中有什么方法可以忽略它(比如Hibernate中的@NotFound)?
试着
@NotFound有效,但我们需要将@OneToOne破解为@ManyToOne.我们还想要一个独立于实现的解决方 注意到这个错误,https://hibernate.atlassian.net/browse/ANN-725
optional = true - 如果这可以按照它应该如何表现的语法含义工作,我就不会写这个.
还尝试了UserDetails.java中的postLoad().
@PostLoad解决方案我们有一个异常的异常处理程序,并且在调用Entity类中的@PostLoad之前会捕获异常.
在Entity.java中
@PostLoad
public void postLoad(){
try {
System.out.println(this.getCreatedBy()); //Before control comes here, it goes to aop …Run Code Online (Sandbox Code Playgroud) 我读过了
寻找解决方案来映射一对一的关系.但是,这些文章中的演示都是多对一或一对多.从演示中,我得出结论,在大多数情况下,我们将ONE侧注释为@JsonManagedReference,将MANY侧注释为@JsonBackReference.
但是,没有关于如何映射一对一的提示.你有什么主意吗?
而且,如果它是双向的一对一怎么办?
这个问题最初是错误的,请参阅下面的编辑.我会把它留给上下文.
我一直在考虑建立双向(即一对一)映射的智能方法.映射函数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)来完成,但我觉得应该有一个数据结构来处理它而不必"手动"执行.
所以我应该完全按照ERD描述它的方式创建这个模式+关系.这里我只显示我遇到问题的表格:

所以我想尝试一对一,但出于某种原因,无论我改变什么,我都会在有外键的任何表上获得一对多.
这是我对这两个表的sql.
CREATE TABLE lab4.factory(
factory_id INTEGER UNIQUE,
address VARCHAR(100) NOT NULL,
PRIMARY KEY ( factory_id )
);
CREATE TABLE lab4.employee(
employee_id INTEGER UNIQUE,
employee_name VARCHAR(100) NOT NULL,
factory_id INTEGER REFERENCES lab4.factory(factory_id),
PRIMARY KEY ( employee_id )
);
Run Code Online (Sandbox Code Playgroud)
在这里,我得到同样的东西.我不是一对一的关系,而是一对一的关系.Invoiceline是一个弱势实体.

这是我的第二张图片的代码.
CREATE TABLE lab4.product(
product_id INTEGER PRIMARY KEY,
product_name INTEGER NOT NULL
);
CREATE TABLE lab4.invoiceLine(
line_number INTEGER NOT NULL,
quantity INTEGER NOT NULL,
curr_price INTEGER NOT NULL,
inv_no INTEGER REFERENCES invoice,
product_id INTEGER REFERENCES lab4.product(product_id),
PRIMARY KEY ( inv_no, …Run Code Online (Sandbox Code Playgroud) 我工作于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)