标签: one-to-many

JPA一对多过滤

我们正在筑巢几个实体.但是在检索时我们只想获得那些活跃的实体.

@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方法来解决这个问题?

java jpa one-to-many

15
推荐指数
2
解决办法
2万
查看次数

Hibernate @OneToMany关系导致JSON结果中的无限循环或空条目

我有两个实体,一个实体"电影"和一个实体"剪辑"每个剪辑属于一个电影,一个电影可以有多个剪辑.

我的代码看起来像:

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"}

条目"剪辑"仍然出现.这仍然是错误的解决方案还是我必须忍受这个?

json hibernate one-to-many hibernate-onetomany

15
推荐指数
3
解决办法
2万
查看次数

CoreData可选的多对多关系永远不会是零?

Quirk我刚刚发现,并想与这里的任何人确认这是否可以避免.基本上,如果我有一个非常简单的两个实体模型:

在此输入图像描述

随着之间的一对多关系Entity1Entity2.该关系是可选的,在双方都是nullify作为删除规则.但是,如果我插入一个新Entity1children关系值将是一个空集,而不是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是否真的以合理直接的方式支持这一点?目前似乎没有,这意味着我将不得不寻找另一种(不太直接)的方式来表示我的模型.

谢谢,

Ĵ

null core-data one-to-many relationship nsmanagedobject

15
推荐指数
1
解决办法
1512
查看次数

在EF Code First中启用级联删除而不暴露外键

在不暴露外键的情况下执行一对多关系的删除时,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中启用级联删除而不在关系的多方面暴露外键?

entity-framework one-to-many code-first cascading-deletes

14
推荐指数
1
解决办法
8068
查看次数

用于OneToMany双向映射的Hibernate和H2"参照完整性约束违规"

所以我有两个简单的豆子--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)

hibernate foreign-keys h2 bidirectional one-to-many

14
推荐指数
1
解决办法
4万
查看次数

何时在Doctrine2中维持反向关系是否值得?

在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和水合作用可能都行不通.这就是为什么我不明白为什么添加反向关系是一个坏主意.

doctrine relational-database one-to-many dql doctrine-orm

13
推荐指数
1
解决办法
934
查看次数

@OneToMany映射列表大小限制

有没有办法限制JPA中@OneToMany关系的列表大小?这是我的代码示例:

@OneToMany(mappedBy = "publication", cascade=CascadeType.PERSIST)
private List<Comment> commentList;
Run Code Online (Sandbox Code Playgroud)

我正在使用EclipseLink 2.3 JPA实现.提前致谢.

java jpa one-to-many

13
推荐指数
2
解决办法
2万
查看次数

Symfony2 + Doctrine - 验证一对多实体集合

我有一个表单来创建一个新实体.该实体还有一系列其他实体,这些实体也以该形式输入.

我想使用集合中实体的验证选项来验证这些实体,但它不起作用.检查"主"实体(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)

如何获取表单以验证提供的地址实体?

collections validation doctrine one-to-many symfony

13
推荐指数
4
解决办法
9062
查看次数

加入一对多并检索单个结果

我有两个表,在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 …

sql postgresql select join one-to-many

13
推荐指数
2
解决办法
2万
查看次数

SQLAlchemy:直接从一对多关系中删除对象,而不使用session.delete()

我有以下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不使用NULLpost_id 的值更新注释(由于列上的非空约束而不允许),但是删除注释?我知道我可以做session.delete(comment) …

python mysql session sqlalchemy one-to-many

13
推荐指数
1
解决办法
1万
查看次数