2016-09-16 63 views
0

我有一个名为ACCOUNT的表,其中包含account_id,position_id和更多列。另一个表我有PositionCombination,它由colons position_id和几个组成。使用jpa删除数据库中的行

这是帐户类我有

@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基础上的数据库中的特定位置并存储到positionCombinationList中。

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

在第二个示例中,您调用persist仍然没有改变内存中的对象。你期望会发生什么? –

+0

@AlanHay在清除之前,我将所有的数据保存到帐户表中。但是这些代码我没有发布。 –

+0

投票结束。 –

回答

0

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

在第一个中,您将从帐户获得allPositions属性。然后清除所有与该关系有关的PositionCombination个实体。

考虑allPositions属性标注有@OneToMany使用以下参数:

orphanRemoval=true 

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

在第二个实现中,您正在执行JPA查询并将结果作为列表列表不是实体属性,所以清除它不会影响数据库或实体状态。你必须明确地删除这些实体。您也不再需要帐户实例。