¿@ Columna insertable, actualizable no va bien con Spring JPA?
Escenario: tengo 3 tablas, Offer, Channel y Offer_Channels. Básicamente, Channel es una tabla de búsqueda, es decir, la aplicación no puede insertar ni actualizar los valores de esa tabla. Una oferta puede contener uno o varios canales. Utilizo los valores de la tabla de canales para completar las casillas de verificación dinámicas. De todos modos, aquí está lo que tengo:
@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
}
Aquí está la entidad del canal:
@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
}
Ahora, cuando un usuario crea una oferta, necesito insertar una fila en la tabla Oferta y las tablas Oferta_Canales y no hacer nada (Sin actualizaciones / inserciones) para la tabla Canal. Inicialmente, los tres pasarían, así que para lograr la parte de "no hacer nada en la tabla del canal", puse insertable = false y actualizable = false en las columnas de la tabla del canal y eso funcionó de maravilla. Ahora usé Hibernates simples para esto. Quiero decir que escribí una aplicación Java independiente y una clase principal para agregar una oferta usando la sesión de hibernate.save (oferta). Ejecutó las siguientes consultas:
Hibernate: insert into OFFER
Hibernate: insert into OFFER_CHANNELS
Bien, ahora, tengo un servicio de descanso donde estoy usando el repositorio JPA de Spring para guardar la información y tengo la misma configuración de objetos de dominio. Ahora, cuando agrego una oferta, se ejecuta:
Hibernate: insert into OFFER
Hibernate: insert into CHANNEL ( It is failing here obviously. I don't want this step to happen)
Mi pregunta: 1. ¿Por qué está tratando de escribir algo en la tabla de canales aunque le di insertable = false en su objeto de dominio, y esto solo sucede con la configuración Spring JPA? Con la configuración de hibernación simplemente funciona bien. 3. ¿@ JoinTable / @OneToMany / insertable / updateble no funciona bien con el repositorio Spring JPA? Que me estoy perdiendo aqui ?
ACTUALIZAR :
@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);
}
Y en el servicio REST solo estoy inyectando el servicio y llamándolo, así que no hay lógica de negocios en el servicio REST. En este momento estoy obteniendo y la razón es que está tratando de insertar el registro en la tabla de canales:
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"