@ Вставляемая колонка, updateble не подходят для Spring JPA?
Сценарий: у меня есть 3 таблицы, Предложение, Канал и Предложение_Каналы. По сути, Channel является таблицей поиска, то есть значения в этой таблице не могут быть ни вставлены, ни обновлены приложением. Предложение может содержать один или несколько каналов. Я использую значения таблицы Channel для заполнения динамических флажков. В любом случае, вот что у меня есть:
@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_Channels и ничего не делать (без обновлений / вставок) для таблицы каналов. Изначально все три происходило, поэтому для достижения части «ничего не делать с таблицей каналов» я вставил вставки = false и updateable = false в столбцы таблицы каналов, и это сработало как шарм. Теперь я использовал простые спящие для этого. Я имею в виду, что я написал отдельное Java-приложение и основной класс, чтобы добавить предложение с использованием session.save hibernate (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. Почему он пытается что-то записать в таблицу Channel, хотя я дал inserttable = false в его доменном объекте, и это происходит только с установкой Spring JPA. С настройкой гибернации он просто отлично работает. 3. Разве @ JoinTable / @OneToMany / inserttable / 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);
}
}
Репо:
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"