我们正在筑巢几个实体.但是在检索时我们只想获得那些活跃的实体.
@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"}
条目"剪辑"仍然出现.这仍然是错误的解决方案还是我必须忍受这个?
Quirk我刚刚发现,并想与这里的任何人确认这是否可以避免.基本上,如果我有一个非常简单的两个实体模型:
随着之间的一对多关系Entity1
和Entity2
.该关系是可选的,在双方都是nullify作为删除规则.但是,如果我插入一个新Entity1
的children
关系值将是一个空集,而不是nil
:
NSManagedObject *object = [NSEntityDescription
insertNewObjectForEntityForName:@"Entity1"
inManagedObjectContext:[self managedObjectContext]];
assert([object valueForKey:@"children"] != nil);
Run Code Online (Sandbox Code Playgroud)
此外,我无法明确将关系设置为nil
:
[object setValue:nil forKey:@"children"];
assert([object valueForKey:@"children"] != nil);
Run Code Online (Sandbox Code Playgroud)
我已经在一个新的,最小的项目中验证了这一点,这似乎是一个真正的实现细节.问题是,我希望能够区nil
分值(表示当前未知)和空集(真正的零到零关系).CoreData是否真的以合理直接的方式支持这一点?目前似乎没有,这意味着我将不得不寻找另一种(不太直接)的方式来表示我的模型.
谢谢,
Ĵ
在不暴露外键的情况下执行一对多关系的删除时,EF会删除父记录并尝试使子记录上的外键为空.这当然会导致错误,因为外键不可为空.将外键添加到子类会覆盖此行为,但我宁愿不公开它.
例如,给定以下两个类,我不希望将JobId作为Project类的属性.
public class Job : ModelBase
{
[Required]
[StringLength(100)]
public string Company { get; set; }
[Required]
[StringLength(100)]
public string JobTitle { get; set; }
public ICollection<Project> Projects { get; set; }
}
public class Project : ModelBase
{
[Required]
[StringLength(100)]
public string Name { get; set; }
[Required]
public string Summary { get; set; }
public int JobId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在EF Code First中启用级联删除而不在关系的多方面暴露外键?
所以我有两个简单的豆子--FatKid和汉堡包.现在,由于我不知道的原因,我不仅要查看有人吃过的所有汉堡包,还要吃谁吃了哪个汉堡包.在代码上!
FatKid.java
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Table
@Entity
public class FatKid {
private int id;
private String name;
private List<Hamburger> hamburgers;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "FATKID_ID")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(cascade = CascadeType.ALL) …
Run Code Online (Sandbox Code Playgroud) 在Doctrine手册中,尽可能在Constrain关系下,它给出了"消除非必要关联"和"尽可能避免双向关联"的建议.我不明白什么标准会使协会"必不可少".
我之所以这么说,是因为看起来你经常想要从一对多关系的一方而不是多方方面.例如,我想获取所有用户的活动PhoneNumbers,而不是获取所有活动的PhoneNumbers及其关联的用户.当您必须遍历多个一对多关系时,这变得更加重要,例如,如果您希望在过去两天内看到所有具有MissedCall的用户(MissedCall-> PhoneNumber-> User).
这是简单情况下反向关联的外观:
SELECT * FROM User u
LEFT JOIN u.PhoneNumbers p WITH p.active
Run Code Online (Sandbox Code Playgroud)
如果有一种方法可以在DQL中以相反的方向跨越给定关系,那将会更加明智,如下面的原始SQL:
SELECT * FROM User u
LEFT JOIN PhoneNumber p ON p.User_id = u.id AND p.active
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么他们提出这个建议,在什么情况下值得忽略?
- 编辑 -
如果有缓解因素或其他解决方法,请给我简单的示例代码或链接.
当没有定义逆时,我没有看到任何方法来遍历关系的逆,所以我将假设构建自定义DQL 实际上不是一个解决方案 - 有一些与SQL 无关的连接是不可能的无论如何,DQL和水合作用可能都行不通.这就是为什么我不明白为什么添加反向关系是一个坏主意.
有没有办法限制JPA中@OneToMany关系的列表大小?这是我的代码示例:
@OneToMany(mappedBy = "publication", cascade=CascadeType.PERSIST)
private List<Comment> commentList;
Run Code Online (Sandbox Code Playgroud)
我正在使用EclipseLink 2.3 JPA实现.提前致谢.
我有一个表单来创建一个新实体.该实体还有一系列其他实体,这些实体也以该形式输入.
我想使用集合中实体的验证选项来验证这些实体,但它不起作用.检查"主"实体(Person)的验证规则,但addressList
不检查集合(Address)中实体的验证规则.当我在字段中输入无效信息时,已成功验证提交的表单.
在此示例中,街道的注释不用于验证.
class Person
{
...
/**
* @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"})
*/
protected $addressList;
....
}
class Address
{
...
/**
* @ORM\ManyToOne(targetEntity="Person", inversedBy="addressList")
* @ORM\JoinColumn(name="person_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $owner;
/**
* @ORM\Column(type="string", length=75)
* @Assert\MinLength(
* limit=3,
* message="Street must have atleast {{ limit }} characters."
* )
*/
protected $street;
...
}
Run Code Online (Sandbox Code Playgroud)
如何获取表单以验证提供的地址实体?
我有两个表,在PostgreSQL中如果重要的话,有一对多的关系.我需要加入它们,以便对于每个"one"我只从"many"表中得到单个结果.不仅如此,我还需要从"许多"表中挑出特定的结果.
TABLE_A ID | NAME | DATE | MORE COLS.... 1 | JOHN | 2012-01-10 | .... 2 | LIZA | 2012-01-10 | .... 3 | ANNY | 2012-01-10 | .... 4 | JAMES | 2012-01-10 | .... ... TABLE_B ID | CODE1 | CODE2 | SORT 1 | 04020 | 85003 | 1 1 | 04030 | 85002 | 4 2 | 81000 | 80703 | 1 3 | 87010 | 80102 | 4 3 | 87010 | 84701 …
我有以下SQLAlchemy设置:
Base = declarative_base()
class Post(Base):
__tablename__ = 'post'
id = Column(Integer, primary_key=True)
title = Column(String(30))
comments = relationship('Comment', cascade='all')
class Comment(Base):
__tablename__ = 'comment'
id = Column(Integer, primary_key=True)
post_id = Column(Integer, ForeignKey(Post.id, ondelete='CASCADE'), nullable=False)
text = Column(Text)
Run Code Online (Sandbox Code Playgroud)
有了这个,我可以用注释的一对多关系创建post对象.我想处理创建和删除帖子的评论而不引用会话.在帖子中添加评论就可以了:
post = Post(title='some post')
comment = Comment(text='some comment')
post.comments.append(comment)
Run Code Online (Sandbox Code Playgroud)
我的会话处理程序只知道帖子,因此它会执行一个操作session.add(post)
,注释会自动放入会话中,并在下一个数据库中与数据库同步session.commit()
.但是,删除评论的情况也是如此.我希望能够通过以下方式删除评论:
post.comments.remove(comment)
Run Code Online (Sandbox Code Playgroud)
但是,这会在下一个产生以下错误session.commit()
:
sqlalchemy.exc.OperationalError: (OperationalError) (1048, "Column 'post_id' cannot be null") 'UPDATE comment SET post_id=%s WHERE comment.id = %s' (None, 1L)
Run Code Online (Sandbox Code Playgroud)
如何告诉SQLAlchemy不使用NULL
post_id 的值更新注释(由于列上的非空约束而不允许),但是删除注释?我知道我可以做session.delete(comment) …
one-to-many ×10
doctrine ×2
hibernate ×2
java ×2
jpa ×2
code-first ×1
collections ×1
core-data ×1
doctrine-orm ×1
dql ×1
foreign-keys ×1
h2 ×1
join ×1
json ×1
mysql ×1
null ×1
postgresql ×1
python ×1
relationship ×1
select ×1
session ×1
sql ×1
sqlalchemy ×1
symfony ×1
validation ×1