1
아래 엔티티가 있습니다.@OrderColumn 및 @OneToMany가있는 엔티티를 저장하는 동안 ConstraintViolationException이 발생했습니다.
@Entity
public class Shop {
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }, orphanRemoval = true)
@JoinTable(name = "shop_image",
joinColumns = @JoinColumn(name = "shop_id"),
inverseJoinColumns = @JoinColumn(name = "image_id"))
@OrderColumn(name = "order_number")
@BatchSize(size = 20)
private List<Image> images = new ArrayList<Image>(0);
}
shop_image 나타난 == (아이디 PK, shop_id, image_id, ORDER_NUMBER) 및 고유 제한 (shop_id, image_id)을 갖는다. (트랜잭션 문맥에서) 호출 코드 아래
:
- 모든 이미지를 삭제
@PersistenceContext EntityManager em; @Transactional // shop exist in DB public void reorderImages(Shop shop) { //shop.getImages().size == 2; {img0, img1} List<Image> newImages = new ArrayList<>(); newImages.add(shop.getImages().get(1)); newImages.add(shop.getImages().get(0)); shop.setImages(newImages); // {img1, img0} em.merge(shop); }
내가 예외 이하 얻을 수는
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '5458-98711' for key 'uniqShopAndImage' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.Util.getInstance(Util.java:386) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1039) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2345) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187) ... 76 more
나는 것이 가능하다는 것을 알고있다 shop //shop.getImages(). clear()
- em.flush()
- shop.setImages (newImages); 나는이 솔루션을 좋아하지 않아
그러나