Я работал над созданием инструмента для загрузки / обновления данных в Maria DB с использованием Spring Boot и JPA / Hibernate.Я хочу загрузить данные в таблицу с составными первичными ключами.Ниже я попробовал
Класс встроенного первичного ключа, он состоит из двух первичных ключей, ключа и языка
@Embeddable
public class MessageResourcePK implements Serializable {
/**
*
*/
private static final long serialVersionUID = -4226351093015653675L;
private String language;
private String key;
public MessageResourcePK() {}
public MessageResourcePK(String language, String key) {
super();
this.language = language;
this.key = key;
}
/**
* @return the language
*/
@Column(name = "LANGUAGE")
public String getLanguage() {
return this.language;
}
/**
* @param language the language to set
*/
public void setLanguage(String language) {
this.language = language;
}
/**
* @return the key
*/
@Column(name = "KEY")
public String getKey() {
return this.key;
}
/**
* @param key the key to set
*/
public void setKey(String key) {
this.key = key;
}
@Override
public boolean equals(Object obj) {
boolean resultat = false;
if (obj == this) {
resultat = true;
} else {
if (!(obj instanceof MessageResourcePK)) {
resultat = false;
} else {
MessageResourcePK autre = (MessageResourcePK) obj;
if (!this.language.equals(autre.language)) {
resultat = false;
} else {
if (!this.key.equals(autre.key)) {
resultat = false;
} else {
resultat = true;
}
}
}
}
return resultat;
}
@Override
public int hashCode() {
return (this.language + this.key).hashCode();
}
Фактический класс таблицы
@Entity
@Table(name = "MESSAGE_RESOURCE")
@IdClass(MessageResourcePK.class)
public class MessageResourceTable implements
Comparable<MessageResourceTable> {
/**
*
*/
private static final long serialVersionUID = -4226351093015653675L;
private String language;
private String key;
private String message;
/**
* @return the language
*/
@Id
@Column(name = "LANGUAGE")
public String getLanguage() {
return this.language;
}
/**
* @param language the language to set
*/
public void setLanguage(String language) {
this.language = language;
}
/**
* @return the key
*/
@Id
@Column(name = "KEY")
public String getKey() {
return this.key;
}
/**
* @param key the key to set
*/
public void setKey(String key) {
this.key = key;
}
/**
* @return the message
*/
@Column(name = "MESSAGE")
public String getMessage() {
return this.message;
}
/**
* @param message the message to set
*/
public void setMessage(String message) {
this.message = message;
}
@Override
public int compareTo(final MessageResourceTable o) {
return this.language.compareTo(o.getLanguage()) +
this.key.compareTo(o.getKey());
}
Репозиторий JPA для этого
@Repository("MessageResourceService")
@Transactional
public interface MessageResourceService extends
JpaRepository<MessageResourceTable, MessageResourcePK>{
}
Метод findAll работает нормально, но когда я пытаюсь использовать метод save, он генерируетследующий запрос
update
message_resource
set
message=?
where
key=?
and language=?
Но в Maria DB это не будет выполнено, я попытался локально с помощью следующего запроса, который отлично работает
update message_resource m set m.MESSAGE = 'jjjj' where m.`KEY`='someKey' and
m.`LANGUAGE`='someLanguage'
Поскольку сгенерированный запрос неправильный, он выбрасывает SQLGrammarException , поскольку перед ключом должно быть что-то вроде m.key , есть ли какое-то решение для этого.Пожалуйста, не отмечайте это как дубликат, потому что я искал через stackoverflow, и никто не получил такой же случай, как я.
Файл application.properties
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password =
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen
database
spring.jpa.properties.hibernate.dialect =
org.hibernate.dialect.MariaDBDialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = validate
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.current_session_context_class
=org.springframework.orm.hibernate5.SpringSessionContext
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true