@ Spalte einfügbar, Updateble passt nicht zu Spring JPA?

Scenario: Ich habe 3 Tabellen, Offer, Channel und Offer_Channels. Grundsätzlich ist Channel eine Nachschlagetabelle, dh die Werte in dieser Tabelle können von der Anwendung weder eingefügt noch aktualisiert werden. Ein Angebot kann einen oder mehrere Kanäle enthalten. Ich verwende die Werte der Kanaltabelle, um dynamische Kontrollkästchen zu füllen. Sowieso ist hier, was ich habe:

@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

}

Hier ist die Channel-Entität:

@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

}

Nun, wenn ein Benutzer ein Angebot erstellt, muss ich eine Zeile in die Angebotstabelle und die Offer_Channels-Tabellen einfügen und nichts für die Kanaltabelle tun (keine Aktualisierungen / Einfügungen). Anfänglich würden alle drei passieren. Um den Teil "Mach nichts mit der Kanaltabelle" zu erreichen, habe ich insertable = false und updateable = false in die Kanaltabellenspalten eingefügt und das hat wie ein Zauber funktioniert. Jetzt habe ich dafür einfache Hibernates verwendet. Ich meine, ich habe eine eigenständige Java-Anwendung und eine Hauptklasse geschrieben, um ein Angebot mithilfe von session.save (offer) von hibernate hinzuzufügen. Es wurden folgende Abfragen ausgeführt:

  Hibernate: insert into OFFER 
  Hibernate: insert into OFFER_CHANNELS 

Okay, jetzt habe ich einen Rest-Service, bei dem ich das JPA-Repository von Spring verwende, um die Informationen zu speichern, und ich habe die gleichen Domänenobjekte eingerichtet. Wenn ich jetzt ein Angebot hinzufüge, lautet es:

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

Meine Frage: 1. Warum wird versucht, etwas in die Kanaltabelle zu schreiben, obwohl ich im Domänenobjekt insertable = false angegeben habe, und dies geschieht nur mit dem Spring JPA-Setup. Im Ruhezustand funktioniert es einwandfrei. 3. Passt @ JoinTable / @OneToMany / insertable / updateble nicht zum Spring JPA-Repository? Was vermisse ich hier?

AKTUALISIERE :

@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);
}

Und im REST-Service Ich injiziere nur den Service und rufe ihn auf, also keine Geschäftslogik im REST-Service. Im Moment bekomme ich und der Grund ist, dass versucht wird, einen Datensatz in die Kanaltabelle einzufügen:

 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"

Antworten auf die Frage(0)

Ihre Antwort auf die Frage