【问题标题】:deleting rows from database using jpa使用 jpa 从数据库中删除行
【发布时间】:2016-09-16 07:29:40
【问题描述】:

我有一个名为 ACCOUNT 的表,它由 account_id、position_id 和几列组成。另一个表我有 PositionCombination,它由列 position_id 和其他几个组成。

这是我拥有的帐户类

@RooJavaBean
@RooToString
@RooJpaActiveRecord
@RooJpaEntity
public class Account {

@OneToMany(mappedBy="account", fetch=FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
List<PositionCombination> allPositions = new ArrayList<PositionCombination>();

@OneToMany(mappedBy="account", fetch=FetchType.LAZY, cascade = CascadeType.ALL)
List<Message> messages = new ArrayList<Message>();

 /*@OneToMany(mappedBy="account", fetch=FetchType.LAZY, cascade = CascadeType.ALL)
List<PremiumPlayPositionCombination> premiumPlayPosition = new ArrayList<PremiumPlayPositionCombination>();*/

@OneToMany(mappedBy="account", fetch=FetchType.LAZY, cascade = CascadeType.ALL)
List<PositionCombinationArc> allPositionsArc = new ArrayList<PositionCombinationArc>();



@ManyToOne
@JoinColumn(name="user_id")
private Userr user;

public List<PositionCombination> getOrders() {
return null;
}



public List<PositionCombination> getPositions() {
return null;
}

}

这是 PositionCombinatin 类

package com.uforic.optionstrader.domain;

@RooJavaBean
@RooToString
@RooJpaEntity
@RooJpaActiveRecord(finders = { "findPositionCombinationsByOrderStatus", "findPositionCombinationsByAccount", "findPositionCombinationsByStrategyType" })
public class PositionCombination {

private int positionType;

/*
 * Strategy type = 1 - Short Term Exit
 * 2 - Calendar Exit
 * 3 - Intraday Exit
 * Currently undefined for normal exit
 */
@ManyToOne
@JoinColumn(name = "strategy_id")
private Strategy strategy;


@OneToMany(mappedBy = "positionCombination", targetEntity = AbstractPosition.class, cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
private List<AbstractPosition> positions = new ArrayList<AbstractPosition>();

@ManyToOne
@JoinColumn(name = "account_id")
private Account account;

@NotNull
int orderStatus;


/* 1 - Short term Exit
 * 2 - Calendar Exit 
 */
int strategyType;

@OneToMany(mappedBy="positionCombination", fetch=FetchType.LAZY, cascade = CascadeType.ALL)
List<StrategyExitReport> exitReports = new ArrayList<StrategyExitReport>();

@OneToMany(mappedBy="positionCombination", fetch=FetchType.LAZY, cascade = CascadeType.ALL)
List<StrategyExitTracker> exitTrackers = new ArrayList<StrategyExitTracker>();

@OneToMany(mappedBy="positionCombination", fetch=FetchType.LAZY, cascade = CascadeType.ALL)
List<IntradayExitDecision> intradayExitDecisions = new ArrayList<IntradayExitDecision>();

@OneToMany(mappedBy="positionCombination", fetch=FetchType.LAZY, cascade = CascadeType.ALL)
List<ExitDecision> exitDecisions = new ArrayList<ExitDecision>();

@OneToMany(mappedBy="positionCombination", fetch=FetchType.LAZY, cascade = CascadeType.ALL)
List<Message> messages = new ArrayList<Message>();

public BigDecimal getTotalCostWithMarginPerContract() {
    BigDecimal totalCostWithMargin = BigDecimal.ZERO;
    for (AbstractPosition position : positions) {
        totalCostWithMargin = totalCostWithMargin.add(position.getTotalCostPerContract().add(position.getMarginAmount()));
    }
    return totalCostWithMargin;
}

public BigDecimal getTotalCostWithMargin() {
    BigDecimal totalCostWithMargin = BigDecimal.ZERO;
    for (AbstractPosition position : positions) {
        totalCostWithMargin = totalCostWithMargin.add(position.getTotalCostWithMargin());
    }
    return totalCostWithMargin;
}

public static Integer deletePositions(long accid) {
    return new PositionCombination().deletePositionCombinationByAccount(accid);
}

@Transactional
private Integer deletePositionCombinationByAccount(Long accountid) {
    System.out.println("acc id :" + accountid);
    EntityManager em = PositionCombination.entityManager();
    int result = em.createQuery("DELETE FROM PositionCombination o where o.account.id = :accountid").setParameter("accountid", accountid).executeUpdate();
    return result;
}

public static TypedQuery<PositionCombination> findPositionCombinationsByStrategyTypes(List strategyTypes) {
    EntityManager em = PositionCombination.entityManager();
    TypedQuery<PositionCombination> q = em.createQuery("SELECT o FROM PositionCombination AS o WHERE o.strategyType IN (:strategyTypes)", PositionCombination.class);
    q.setParameter("strategyTypes", strategyTypes);
    return q;
}

}

现在当我运行这段代码时。它从该特定帐户的 positionCombination 表中删除所有 entereis。

public void createSquareOff(User user,Account acc)
{
 List<PositionCombination> positionCombinationList = acc.getAllPositions();
 positionCombinationList.clear();
 acc.persist();
}

但是当我将代码更改为此 .它不是从 PositionCombination 表中删除行。在这里,我刚刚做了一些小的更改,而不是获取 AllPositions,而是根据 position_id 从 DB 获取特定的 Positions 并将其存储到该 positionCombinationList 中。

 public void createSquareOff(User user,Account acc,PositionCombination posComb )
 {
  List<PositionCombination> positionCombinationList = PositionCombination.findPoscomByPoscombination(posComb);
  positionCombinationList.clear();
  acc.persist();
 }

【问题讨论】:

  • 在第二个示例中,您正在对一个无论如何都没有更改的内存对象调用persist。您希望会发生什么?
  • @AlanHay 在清除之前,我将所有数据保存到帐户表中.. 但是我没有发布这些代码。
  • 投票结束。
  • @AlanHay 我的问题是为什么当我使用手动查询检索数据时它可以删除数据。
  • 因为你没有修改被保存的对象:acc。试试这个acc.removeAll( positionCombinationList); acc.persist();

标签: jpa spring-roo


【解决方案1】:

这两种方法实现有很大区别。

在第一个中,您从 Account 获取 allPositions 属性。然后从该关系中清除所有相关的 PositionCombination 实体。

考虑到 allPositions 属性用 @OneToMany 注释,并带有以下参数:

orphanRemoval=true

它告诉 JPA 提供者在从关系中删除相关实体时删除它们。这就是为什么当您清除 allPositions 属性时所有相关的 PositionCombination 都会被删除。

在第二个实现中,您正在执行 JPA 查询并将结果作为 List。该 List 不是实体属性,因此清除它不会影响数据库或实体状态。您必须明确删除这些实体。此外,您不再需要 Account 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2018-08-03
    • 1970-01-01
    • 2013-05-28
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多