我是核心数据建模的新手,我很难理解一对多关系是如何工作的.
我有一个名为的父实体Task
,它可以有几个Comment
实体实例.我这样建模:on Comments
,与实体一起Task
调用目的地的关系.在,关系称为,其目的地,两个关系彼此相反. task
Task
Task
comments
Comment
未定义反向导致警告或错误消息.虽然这种方式的建模有效,但我注意到,一旦我为给定的第二个注释创建Task
,第一个被替换(一对一的关系).
告诉核心数据模型这种关系允许多个注释合在一起的正确方法是什么Task
?
此外,由于CoreData似乎自己管理主键,我如何创建一个NSPredicate
检索给定任务的所有注释?
谢谢你的任何建议!
我想用20个子实体来持久保存父实体,我的代码如下
家长班
@OneToMany(mappedBy = "parentId")
private Collection<Child> childCollection;
Run Code Online (Sandbox Code Playgroud)
儿童班
@JoinColumn(name = "parent_id", referencedColumnName = "parent_id")
@ManyToOne(optional=false)
private Parent parent;
Run Code Online (Sandbox Code Playgroud)
String jsonString = "json string containing parent properties and child collection"
ObjectMapper mapper = new ObjectMapper();
Parent parent = mapper.readValue(jsonString, Parent.class);
public void save(Parent parent) {
Collection<Child> childCollection = new ArrayList<>() ;
for(Child tha : parent.getChildCollection()) {
tha.setParent(parent);
childCollection.add(tha);
}
parent.setChildCollection(childCollection);
getEntityManager().persist(parent);
}
Run Code Online (Sandbox Code Playgroud)
所以,如果有20个子表,那么我必须在每个子表中设置父引用,因为我必须写20个for循环?这可行吗?有没有其他方式或配置,我可以自动坚持父母和孩子?
我正在使用Backpack for Laravel来提供我的laravel网站的后端区域.
我的数据库结构中有以下表格:
这是为匹配添加集合,并为锦标赛添加匹配.
这些是我的模特:
比赛模型:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;
class Tournament extends Model
{
use CrudTrait;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $fillable = ['from', 'to', 'type', 'location', 'place'];
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
public function matches()
{
return $this->hasMany('App\Models\Match');
}
}
Run Code Online (Sandbox Code Playgroud)
匹配模型:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;
class Match extends Model
{
use CrudTrait;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table …
Run Code Online (Sandbox Code Playgroud) 从上面描述的映射中删除元素时遇到问题.这是映射:
@Entity @Table( name = "foo") class Foo { private List bars; @OneToMany @OrderColumn( name = "order_index" ) @JoinTable( name = "foo_bar_map", joinColumns = @JoinColumn( name = "foo_id" ), inverseJoinColumns = @JoinColumn( name = "bar_id" ) ) @Fetch( FetchMode.SUBSELECT ) public List getBars() { return bars; } }
插入Bar-instances并保存Foo工作正常,但是当我从列表中删除元素并再次保存时,违反了映射表中bar_id的唯一约束.以下SQL语句是由hibernate发布的,这看起来很奇怪:
LOG: execute : delete from foo_bar_map where foo_id=$1 and order_index=$2 DETAIL: parameters: $1 = '4', $2 = '6' LOG: execute S_5: update foo_bar_map set bar_id=$1 where foo_id=$2 and order_index=$3 DETAIL: parameters: …
对不起,如果这个问题太简单了; 我只进入了9年级.
我正在尝试了解NoSQL数据库设计.我想设计一个最小化读/写次数的Google Datastore模型.
这是博客文章的玩具示例和一对多关系中的评论.哪个更有效 - 将所有注释存储在StructuredProperty中或使用Comment模型中的KeyProperty?
同样,目标是最小化对数据存储的读/写次数.您可以做出以下假设:
使用StructuredProperty:
from google.appengine.ext import ndb
class Comment(ndb.Model):
various properties...
class BlogPost(ndb.Model):
comments = ndb.StructuredProperty(Comment, repeated=True)
various other properties...
Run Code Online (Sandbox Code Playgroud)
使用KeyProperty:
from google.appengine.ext import ndb
class BlogPost(ndb.Model):
various properties...
class Comment(ndb.Model):
blogPost = ndb.KeyProperty(kind=BlogPost)
various other properties...
Run Code Online (Sandbox Code Playgroud)
请尽量提出与有效表示一对多关系相关的任何其他注意事项,以尽量减少对数据存储区的读/写次数.
谢谢.
google-app-engine one-to-many nosql app-engine-ndb google-cloud-datastore
我继承了一个hibernate应用程序,但我遇到了问题.似乎代码不会将孩子保存为一对多关系.它是双向的,但是在保存父对象时,它似乎不会保存孩子.
在这种情况下,Question类是父类.
// Question.java
@Entity
@SequenceGenerator(name = "question_sequence", sequenceName = "seq_question", allocationSize = 1000)
@Table(name = "question")
public class Question {
protected Long questionId;
protected Set<AnswerValue> answerValues;
public TurkQuestion(){}
public TurkQuestion(Long questionId){
this.questionId = questionId;
}
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "question_sequence")
@Column(name = "question_id")
public Long getQuestionId(){
return questionId;
}
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "question_id",referencedColumnName="question_id")
public Set<AnswerValue> getAnswerValues(){
return answerValues;
}
public void setQuestionId(Long questionId){
this.questionId = questionId;
}
public void setAnswerValues(Set<AnswerValue> answerValues){
this.answerValues = answerValues;
} …
Run Code Online (Sandbox Code Playgroud) 我想首先说我意识到数据库结构很糟糕,但我现在无法改变它.
话虽这么说,我需要在Hibernate(4.2.1)中创建一对多的双向关系,它不涉及主键(只有关系的"父"侧的唯一键)而且没有连接表.表示此关系的外键是从"子"到"父"的后向指针(见下文).我搜索并尝试了各种不同的注释配置而没有运气.我要求的是什么?
GLOBAL_PART
CREATE TABLE "GLOBAL_PART" (
"GLOBAL_PART_ID" NUMBER NOT NULL,
"RELEASES" NUMBER,
CONSTRAINT "GLOBAL_PART_PK" PRIMARY KEY ("GLOBAL_PART_ID"),
CONSTRAINT "GLOBAL_PART_RELEASES_UK" UNIQUE ("RELEASES")
);
Run Code Online (Sandbox Code Playgroud)
PART_RELEASE
CREATE TABLE "PART_RELEASE" (
"PART_RELEASE_ID" NUMBER NOT NULL,
"COLLECTION_ID" NUMBER,
CONSTRAINT "PART_RELEASE_PK" PRIMARY KEY ("PART_RELEASE_ID"),
CONSTRAINT "GLOBAL_PART_RELEASE_FK" FOREIGN KEY ("COLLECTION_ID")
REFERENCES "GLOBAL_PART" ("RELEASES") ON DELETE CASCADE ENABLE
);
Run Code Online (Sandbox Code Playgroud)
参考:
PART_RELEASE GLOBAL_PART
------------------- ------------
PART_RELEASE_ID (PK) GLOBAL_PART_ID (PK)
COLLECTION_ID -------------> RELEASES (UK)
Run Code Online (Sandbox Code Playgroud)
GlobalPart.java
@Entity
@Table(name = "GLOBAL_PART")
@SequenceGenerator(name = "SEQUENCE_GENERATOR", sequenceName = "GLOBAL_PART_SEQ")
public …
Run Code Online (Sandbox Code Playgroud) 这似乎是一个常见的案例,但作为JPA新手,我很难搞清楚这一点.我正在使用EclipseLink和PostgreSQL,但这应该只涉及JPA规范.
我有一个表PRIMARY
有一个ID,然后是一堆其他列.还有另一个表SECONDARY
也有一个外键进入PRIMARY
表中也称为ID
.此SECONDARY
表具有该组合键ID
和表示语言环境的varchar.
因此,在Primary
实体中我想要一个类型字段,Map<String, Secondary>
其中键是SECONDARY
表中的语言环境字符串,条目是Secondary
实体.我的Secondary
班级看起来像这样:
@Entity
public class Secondary
{
@Id
private Long id;
@Id
private String locale;
private String str1;
private String str2;
.....
}
Run Code Online (Sandbox Code Playgroud)
我想我想使用@MapKeyJoinColumn
注释,但我似乎无法使其他注释工作.我试过这个:
@OneToMany
@JoinColumn(name="ID")
@MapKeyJoinColumn(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;
Run Code Online (Sandbox Code Playgroud)
这导致它尝试选择一个名为secondaryByLocale_key的列,该列不存在.
然后我尝试了这个:
@OneToMany
@JoinTable(name="SECONDARY",
joinColumns={@JoinColumn(name="ID")},
inverseJoinColumns=@JoinColumn(name="ID"))
@MapKeyJoinColumn(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
Exception Description: The @JoinColumns on the annotated element [field secondaryByLocale] from …
Run Code Online (Sandbox Code Playgroud) 我们正在筑巢几个实体.但是在检索时我们只想获得那些活跃的实体.
@Entity
public class System {
@Id
@Column(name = "ID")
private Integer id;
@OneToMany(mappedBy = "system")
private Set<Systemproperty> systempropertys;
}
@Entity
public class Systemproperty {
@Id
@Column(name = "ID")
private Integer id;
@Id
@Column(name = "ACTIVE")
private Integer active;
}
Run Code Online (Sandbox Code Playgroud)
在请求时Systemproperties
我只想获取属性active
(active = 1).
搜索我发现了一些hibernate注释和使用子查询的可能性.然而,两者都不适合我.即使我们目前正在使用hibernate,我也在考虑用Eclipselink替换它,因为我们目前不得不使用预先加载,我们可能会遇到性能问题.子查询不能很好地工作,因为我们正在嵌套几个级别.
Eclipselink似乎有一个可以工作的@Customizer注释,但它似乎遵循与hibernate @FilterDef
注释不同的概念,并且在切换时会产生额外的开销.
在@JoinColumn
似乎没有允许进一步的筛选.是否有标准的JPA方法来解决这个问题?
我有两个实体,一个实体"电影"和一个实体"剪辑"每个剪辑属于一个电影,一个电影可以有多个剪辑.
我的代码看起来像:
Movie.java
@OneToMany(mappedBy = "movie", targetEntity = Clip.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Clip> clips = new HashSet<Clip>();
Clip.java
@ManyToOne
@JoinColumn(name="movie_id")
private Movie movie;
Run Code Online (Sandbox Code Playgroud)
正在生成表,每个Clip都有一个列"movie_id"但这会导致我的应用程序在我请求数据时最终处于无限循环中
@Path("/{id:[0-9][0-9]*}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Movie lookupMovieById(@PathParam("id") long id) {
return em.find(Movie.class, id);
}
result:
{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"M...
Run Code Online (Sandbox Code Playgroud)
当我请求剪辑时,结果相同.
当我将它改为@ManyToMany关系时,不会有任何类似的问题,但这不是我在这里需要的.你能帮助我吗?将fetchType设置为Lazy不起作用.
编辑:我正在使用当前的JBoss开发工作室
编辑:
通过阅读本文,我"解决了"这个问题:
http://blog.jonasbandi.net/2009/02/help-needed-mapping-bidirectional-list.html
"要将双向一个映射到多个,一对多一侧作为拥有方,您必须删除mappedBy元素并将多个@JoinColumn设置为可插入且可更新为false.此解决方案显然未进行优化并会产生一些额外的UPDATE语句."
当我要求电影时,我得到以下答案:
{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1, "名称":"演练"}],"剪辑":[],"说明":"预告片zu mgs4"}
条目"剪辑"仍然出现.这仍然是错误的解决方案还是我必须忍受这个?
one-to-many ×10
java ×5
hibernate ×4
jpa ×4
annotations ×1
core-data ×1
ios ×1
jpa-2.0 ×1
json ×1
laravel ×1
laravel-5 ×1
many-to-one ×1
map ×1
nosql ×1
objective-c ×1
php ×1