kullanarak aynı tanımlayıcı Şu anda Spring (Boot) ve JPA ile bir uygulama geliştiriyorum.DataIntegrityViolationException: CRUDRepository
@Entity
@AccessType(AccessType.Type.PROPERTY)
@Table(name = "T_ORDER")
public class Order {
@Id
private String id;
@Version
private Integer version = 0;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "order", cascade = CascadeType.ALL)
private List<Item> items = new ArrayList<>();
private String text;
private String status;
@Deprecated
public Order() {}
public static Order newOrder() {
Order order = new Order();
order.id = UUID.randomUUID().toString();
return order;
}
[... getters and setters ...]
[... equals and hashCode ...]
}
ve
@Entity
@Table(name = "T_ITEM")
@IdClass(Item.ItemId.class)
public class Item {
public static class ItemId implements Serializable {
public String order;
public String id;
[... equals and hashcode ...]
}
@Id
@JsonIgnore
@ManyToOne(cascade = CascadeType.PERSIST)
private Order order;
@Id
private String id;
@Version
private int version = 0;
@Transient
private Product product;
private Integer productId;
private BigDecimal quantity;
private String quantityUnit;
private BigDecimal price;
[... getters and setters ...]
[... equals and hashcode ...]
}
Ben H2 Kullanma uygulama başlatma
@Component
public class OrderLoader implements ApplicationListener<ContextRefreshedEvent> {
private final Logger logger = LoggerFactory.getLogger(getClass());
private OrderRepository orderRepository;
@Autowired
public void setOrderRepository(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
@Override
@Transactional(readOnly = false)
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
try {
Order order = Order.newOrder();
for (int itemId = 1; itemId < 3; itemId++) {
Item item = order.addItem();
item.setProductId(1);
}
order.setText("this is an order");
order.setStatus("delivered");
orderRepository.save(order);
} catch (Exception e) {
logger.error("This shit...", e);
}
}
}
verileri eklemek için bir CRUDRepository
@Repository
public interface OrderRepository extends CrudRepository<Order, String> {
@Transactional
List<Order> removeByStatus(String status);
}
kullanıyorum: Ben şu İki varlık vardır konsol, bunu görebiliyorum tablolar üretiliyor ve boş. Ancak, orderRepository.save (sipariş) çağırırken DataIntegrityViolationException alıyorum.
- tabloları boş,
- Ben kimlikleri UUIDs kullanıyorum ve
- aynı anahtarla iki şirketin birleştirilmesine gerektiğini kaydedin:
Bu şekilde bana çok garip geliyor.
tam StackTrace: saveAndFlush
değişiklikler hemen DB kızarmış olacak birlikte yapılır flush
veya commit
kadar veritabanına geçerli olmayacaktır sadece save
değişiklikleri kullanırken http://pastebin.com/gYk2ZvP4
Bu bir CRUDRepository olduğundan, flush() veya saveAndFlush() yöntemlerine sahip değildir. Onu bir JPARepository olarak değiştirmeye çalıştım ve söz konusu yöntemleri kullandım, ancak İstisna aynı kalıyor. –
@ 3vIL_VIrUs Doğru veritabanını kontrol ettiğinizden emin misiniz? –
Sadece bir tane uygulama için kullanılabilir olduğu gibi, doğru olanı ve tabloların oluşturulmasını sağladım. –