2016-09-16 23 views
0

account_id、position_id、およびそれ以上の列で構成されるACCOUNTという名前のテーブルがあります。別のテーブル私はPositionCombinationを持っています。これは、列のposition_idとそれ以上のもので構成されています。jpaを使用してデータベースから行を削除する

これは私がこのコードを実行するとこれが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; 
} 

}

です。

@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; 
} 

} 

を持つアカウントクラスです特定のアカウントのpositionCombination Tableからすべての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(); 
} 
+0

2番目の例では、とにかく変更されていないメモリ内オブジェクトに対してpersistを呼び出しています。何が起こると思いますか? –

+0

@AlanHay私はすべてのデータを勘定テーブルに保存しています。しかし、これらのコードは投稿していません。 –

+0

それから閉じる投票。 –

答えて

0

2つのメソッドの実装には大きな違いがあります。最初のもので

、あなたはアカウントからallPositions属性を取得しています。その関係からすべての関連するPositionCombinationエンティティをクリアします。

口座にallPositionsを取る属性は、以下のパラメータを使用して@OneToManyでアノテートされています

orphanRemoval=true 

それは彼らが関係から削除されたときに関連するエンティティを削除するにはJPAプロバイダに指示します。そのため、allPositions属性をクリアすると、すべての関連するPositionCombinationが削除されます。

2番目の実装では、JPAクエリを実行し、結果をリストとして取得しています。そのリストはエンティティ属性ではないので、それをクリアしてもデータベースまたはエンティティの状態には影響しません。これらのエンティティを明示的に削除する必要があります。また、アカウントインスタンスはもう必要ありません。

関連する問題