【问题标题】:How to insert a new node to list in JPA?如何插入新节点以在 JPA 中列出?
【发布时间】:2012-03-11 00:05:44
【问题描述】:

好的。假设我有这个:

class Dog{
String name;
List<Leg> legs;
//get and set
}

class Leg{
float lenght;
}

要为狗添加一条新腿(假设它有 3 条): 1-查询此:从 Dog d 中选择 d join d.legs where d.id = 1 2-在获得狗参考后,我将一条新腿添加到列表中: dog.getLegs().add(新腿(3.9));

3-合并狗。:em.merge(dog);

这是更新集合的唯一方法吗?我只是想知道 dog 实例是否占用了不必要的堆空间。 谢谢 Java PROS。

【问题讨论】:

    标签: java jpa collections jpql


    【解决方案1】:

    如果您担心性能,那么您始终可以定义实体之间的双向关系,然后从另一端进行管理。

    @Entity
    @Table(name = "dog")
    public class Dog {
        private String name;
    
        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
        @JoinTable(name = "dog_legs", joinColumns = { @JoinColumn(name = "dog_id", unique = true) }, inverseJoinColumns = { @JoinColumn(name = "leg_id") })
        private Set<Leg> legs;
    }
    
    @Entity
    @Table(name = "legs")
    public class Leg {
        private Integer length;
    
        @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="legs")
        private Dog dog;
    }
    

    通过这种双向映射,您只需加载 Dog 对象即可节省 Dog 腿。

    Dog d = entityManager.find(Dog.class, Long.valueOf(1));
    Leg l = new Leg();
    l.setDog(d);
    l = entityManager.persist(l);
    

    【讨论】:

    • Bid Mapping 是解决此问题的一种简单方法,但我不同意在真正需要的时候使用它。这是加载整只狗的唯一选择吗?
    • 您是否正在寻找一种艰难的方式?您总是可以展平您的对象属性并手动映射 JDBC。
    • 不,我只是在我的 OOP 设计中将出价映射视为增加依赖项:S,不是吗?
    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2023-03-31
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多