복붙노트

[SPRING] @Column insertable, updatable은 Spring JPA와 잘 어울리지 않습니까?

SPRING

@Column insertable, updatable은 Spring JPA와 잘 어울리지 않습니까?

시나리오 : Offer_Channels, Offer, Channel 및 Offer_Channels 테이블이 3 개 있습니다. 기본적으로 채널은 조회 테이블입니다. 즉, 해당 테이블의 값을 응용 프로그램에서 삽입하거나 업데이트 할 수 없습니다. 쿠폰에는 하나 이상의 채널이 포함될 수 있습니다. 채널 테이블 값을 사용하여 동적 확인란을 채 웁니다. 어쨌든, 그래서 여기에 내가 가지고있는 것입니다 :

@Entity
@Table(name = "OFFER")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Offer implements Serializable {

    // Offer Id
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "offer_seq_gen")
    @Column(name = "OFFER_ID")
    private long OfferId;


    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "OFFER_CHANNELS", joinColumns = { @JoinColumn(name = "OFFER_ID") },          inverseJoinColumns = { @JoinColumn(name = "CHANNEL_ID") })
    private Set<Channel> channels = new HashSet<Channel>();

  //Other fields and corresponding getters and setters

}

채널 엔티티는 다음과 같습니다.

@Entity
@Table(name = "CHANNEL")
public class Channel implements Serializable {

    private static final long serialVersionUID = 1L;

    @NotNull
    @Id
    @Column(name = "CHANNEL_ID", insertable=false, updatable=false)
    private Long channelId;

    @Column(name = "CHANNEL_NAME", insertable=false, updatable=false)
    private String channelName;

//getters and setters

}

이제 사용자가 오퍼를 만들 때 Offer 테이블과 Offer_Channels 테이블에 행을 삽입하고 채널 테이블에 아무 것도 (업데이트 / 삽입 없음) 할 필요가 있습니다. 처음에는 세 가지 모두 일어날 것이므로 "do nothing to Channel table"부분을 얻으려면 Channel 테이블 열에 insertable = false 및 updateable = false를 넣으면 매력처럼 작동합니다. 이제 나는 이것을 위해 평범한 Hibernate를 사용했다. 나는 독립형 자바 애플리케이션과 메인 클래스를 써서 hibernate의 session.save (offer)를 사용하는 제안을 추가한다는 것을 의미한다. 그것은 다음 쿼리를 실행했습니다 :

  Hibernate: insert into OFFER 
  Hibernate: insert into OFFER_CHANNELS 

자, 이제 Spring의 JPA 저장소를 사용하여 정보를 저장하고 동일한 도메인 개체 설정을하는 휴식 서비스를 제공합니다. 이제 제안을 추가하면 다음과 같이 실행됩니다.

Hibernate: insert into OFFER 
Hibernate: insert into CHANNEL ( It is failing here obviously. I don't want this step to happen)

내 질문 : 1. 도메인 객체에 insertable = false를 지정 했는데도 Channel 테이블에 무언가를 쓰려고하는 이유는 Spring JPA 설정에서만 발생합니다. 최대 절전 모드로 설정하면 정상적으로 작동합니다. 3. @ JoinTable / @OneToMany / insertable / updateble은 Spring JPA 저장소와 잘 어울리지 않습니까? 내가 여기서 무엇을 놓치고 있니?

업데이트 :

@Service
@Transactional
public class OfferService {

    @Inject
    private OfferRepository offerRepository;


    public Offer saveOfferInformation(Offer offer) {
        log.debug("Saving Offer Info..");
        log.debug("Offer object :"+offer);
        return offerRepository.save(offer);

    }

}

Repo :

public interface OfferRepository extends JpaRepository<Offer, Long> {
    List<Offer> findByBuySku(String buySku);
}

그리고 REST 서비스에서는 서비스를 주입하고 호출하므로 REST 서비스에는 비즈니스 로직이 없다. 지금 당장 가져 오는 이유는 채널 테이블에 레코드를 삽입하려고하기 때문입니다.

 exception: "org.springframework.dao.DataIntegrityViolationException" 
 message: "could not execute statement; SQL [n/a]; constraint [PVS_OWNER.CHANNEL_PK]; nested   exception is org.hibernate.exception.ConstraintViolationException: could not execute statement"

해결법

    from https://stackoverflow.com/questions/25771892/column-insertable-updateble-dont-go-well-with-spring-jpa by cc-by-sa and MIT license