【问题标题】:EclipseLink Avoid Collection Persist / RemoveEclipseLink 避免收集持久化/删除
【发布时间】:2015-10-14 02:23:11
【问题描述】:

我正在使用 EclipseLink,我想知道当Entity 更新或创建时,是否有办法避免对Entity 的集合进行JPA 操作。我有一个 Entity 和以下集合:

@OneToMany(mappedBy = "pageItemAssignment")
private Collection<AllowedUrl> allowedUrls;

当我更新父实体时,从集合中添加或删除的任何内容都将具有 jpa 持久/删除操作。我不希望任何事情发生。我只希望在检索父实体并忽略所有其他操作时填充集合。我将拥有将持久/更新/删除集合中的实体的代码。

我可以在关系上配置忽略操作的配置吗?

谢谢。

【问题讨论】:

    标签: jpa eclipselink


    【解决方案1】:

    据我了解,您不想将某些字段状态保存到数据库。你可以使用注解@Transient

    瞬态实体字段是不参与持久化的字段,它们的值永远不会存储在数据库中。

    @Entity
    public class MyEntity  {
         ....
        @Transient 
         String url; // not persistent because of @Transient
    } 
    

    【讨论】:

    • 这是一个我需要从数据库中提取的集合,所以@Transient 在这里不起作用。
    【解决方案2】:

    我想我一直在用错误的方式处理这个问题。我的新收藏项上的自动持久化使收藏项没有 id 值。我想通过避免该过程来控制保存/更新。

    相反,我选择刷新父实体,以便刷新集合,以便每个新实体在持久化后都有一个 id。现在我需要编写的唯一代码是更新,因为这是唯一不会自动触发的代码。

    【讨论】:

      【解决方案3】:

      假设数据库中已经存在实体,您可以通过将给定字段定义为只读来避免刷新内存中的更改。在您的特定情况下,这可能如下所示:

      @OneToMany(mappedBy="pageItemAssignment")      //non-owning side of the relationship
      private Collection<AllowedUrl> allowedUrls;
      
      @ManyToOne                                     //owning side of the relationship
      @JoinColumn(insertable=false, updatable=false) //read-only field
      private PageItemAssigment pageItemAssignment;
      

      这可以防止 JPA 提供者执行任何操作,除了从数据库中读取关系(不会插入 FK,但会插入其他字段)。 这种方法适用于以下注释:@Column@OrderColumn@JoinColumn@MapKeyColumn@MapKeyJoinColumn

      【讨论】:

      • 我在发布我的问题之前尝试过。父实体更新仍会尝试将对象持久保存在集合中。将 insertable 设置为 false 将忽略外键的值,并尝试在表中创建包含所有其他字段的行。由于外键验证,这当然会失败。
      猜你喜欢
      • 2012-12-14
      • 2013-02-16
      • 2019-10-23
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 2016-01-23
      相关资源
      最近更新 更多