¿@ 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"

Respuestas a la pregunta(0)

Su respuesta a la pregunta