Moin, ich habe eine Spring Boot Anwendung, in welcher es Bots gibt, welche Stocks kaufen können. Meine Bot entity sieht so aus:
und meine Stock entity so:
Wie ihr seht habe ich bei Bot eine Beziehung mit Stock, also immer, wenn ich einen Bot abfrage sollen auch alle stocks returnt werden. Das klappt soweit auch. Jetzt ist es aber so, dass man Stocks auch kaufen soll, das setze ich so um:
Also, was möchte ich hiermit erreichen? Immer wenn ein Stock gekauft wird, der bereits existiert bzw der StockType schon existiert sollen diese ganzen Stocks addiert werden und es soll genau ein Stock in der Datenbank gespeichert werden, der dann die Summe aller Stocks enthält. Das soll die Funktion buildStock machen. Das klappt soweit auch, sobald ich den stock dann aber returne bekomme ich nie den aktuellen stock zurück. Wenn ich davor keinen Stock gespeichert habe dann einen speicherte ist stocks einfach leer. Das sieht dann bspw so aus:
Davor hatte der Stock als moneyLeftToInvest: 1000 jetzt 900, also wurden 100 abgezogen, so wie ich es auch reingereicht habe, aber stocks ist einfach leer. Wenn ich dann den Bot explizit über die id abfrage bekomme ich das korrekte Ergebnis und in stocks ist der Stock auch drinnnen.
Wenn ich jetzt noch eine Anfrage stelle, also noch einen Stock kaufe, dann bekomme ich als return value den alten stock. Also genau den, den ich vorhin vermisst habe. Die return values sind also immer um eins verschoben und ich hab keine Ahnung woran das liegen kann. Es muss etwas damit zu tun haben, dass ich sozusagen in einem Schwung die repositories verändere und zurück gebe, weil wenn ich dann wie gesagt einen Endpoint abfrage, wo ich die id reinreiche und einen Bot zurück bekomme dann bekomme ich das richtige Ergebnis mit dem stock eben. Und an den Fetch Types habe ich übrigens auch schon geschraubt, das hat leider bei EAGER und LAZY keinen Unterschied gemacht.
Java:
@Getter
@Setter
@Entity
@Table(name = "bots")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Bot {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "moneyLeftToInvest")
private BigDecimal moneyLeftToInvest;
@OneToMany(mappedBy = "bot", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
private List<Stock> stocks;
@Column(name = "algorithm_name")
private List<Algorithms> algorithms;
}
und meine Stock entity so:
Code:
@Getter
@Setter
@Entity
@Table(name = "stocks")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Stock {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@JsonIgnore
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.DETACH, CascadeType.REFRESH})
@JoinColumn(name = "fk_botId") // Use the correct column name to refer to the Bot entity
private Bot bot;
@Column(name = "name")
private StockType stockType;
@Column(name = "amount")
private BigDecimal amount;
}
Wie ihr seht habe ich bei Bot eine Beziehung mit Stock, also immer, wenn ich einen Bot abfrage sollen auch alle stocks returnt werden. Das klappt soweit auch. Jetzt ist es aber so, dass man Stocks auch kaufen soll, das setze ich so um:
Code:
@Transactional
public void buyStock(Long id, StockBuyingRequest request) {
Optional<Bot> botOptional = botRepository.findById(id);
if (botOptional.isPresent()) {
List<Stock> stocks = botOptional.get().getStocks();
botOptional.get().setMoneyLeftToInvest(botOptional.get().getMoneyLeftToInvest().subtract(request.getAmount()));
Stock stock = Stock.builder()
.stockType(request.getStockType())
.amount(buildStock(stocks, request))
.bot(botOptional.get())
.build();
botRepository.save(botOptional.get());
stockRepository.save(stock);
}
}
@Transactional
public BigDecimal buildStock(List<Stock> stocks, StockBuyingRequest request) {
BigDecimal sumOfSameStocks = request.getAmount();
List<Stock> filteredStocks = stocks.stream()
.filter(stock -> stock.getStockType() == request.getStockType())
.toList();
for (Stock stock : filteredStocks) {
sumOfSameStocks = sumOfSameStocks.add(stock.getAmount());
stockRepository.deleteById(stock.getId());
}
return sumOfSameStocks;
}
Also, was möchte ich hiermit erreichen? Immer wenn ein Stock gekauft wird, der bereits existiert bzw der StockType schon existiert sollen diese ganzen Stocks addiert werden und es soll genau ein Stock in der Datenbank gespeichert werden, der dann die Summe aller Stocks enthält. Das soll die Funktion buildStock machen. Das klappt soweit auch, sobald ich den stock dann aber returne bekomme ich nie den aktuellen stock zurück. Wenn ich davor keinen Stock gespeichert habe dann einen speicherte ist stocks einfach leer. Das sieht dann bspw so aus:
Code:
{
"id": 5152,
"name": "test",
"moneyLeftToInvest": 900.00,
"stocks": [],
"algorithms": [
"",
""
]
}
Davor hatte der Stock als moneyLeftToInvest: 1000 jetzt 900, also wurden 100 abgezogen, so wie ich es auch reingereicht habe, aber stocks ist einfach leer. Wenn ich dann den Bot explizit über die id abfrage bekomme ich das korrekte Ergebnis und in stocks ist der Stock auch drinnnen.
Wenn ich jetzt noch eine Anfrage stelle, also noch einen Stock kaufe, dann bekomme ich als return value den alten stock. Also genau den, den ich vorhin vermisst habe. Die return values sind also immer um eins verschoben und ich hab keine Ahnung woran das liegen kann. Es muss etwas damit zu tun haben, dass ich sozusagen in einem Schwung die repositories verändere und zurück gebe, weil wenn ich dann wie gesagt einen Endpoint abfrage, wo ich die id reinreiche und einen Bot zurück bekomme dann bekomme ich das richtige Ergebnis mit dem stock eben. Und an den Fetch Types habe ich übrigens auch schon geschraubt, das hat leider bei EAGER und LAZY keinen Unterschied gemacht.