[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
'SPRING' 카테고리의 다른 글
[SPRING] Spring 배치는 태스크 릿에서 동적으로 생성 된 단계를 실행합니다. (0) | 2019.02.22 |
---|---|
[SPRING] Spring-MVC : 훌륭한 인프라 (컨피규레이션) 생성 및 중복 방지 (0) | 2019.02.22 |
[SPRING] Spring-Data-Elasticsearch 설정 : Spring은 설정 파일을 찾을 수 없습니까? (0) | 2019.02.22 |
[SPRING] 봄 RestTemplate - 비동기 대 sync restTemplate (0) | 2019.02.22 |
[SPRING] 감사 추적 테이블을 만들기 위해 최대 절전 모드 인터셉터를 사용하여 db에서 페치하지 않고 previouseState를 얻는 방법? (0) | 2019.02.22 |