Я много искал эту конкретную проблему, но не нашел конкретного решения.У меня есть составной первичный ключ в одной таблице, и одно из полей этого составного первичного ключа является частью составного первичного ключа другой таблицы.Можно сказать, что это конкретное поле является внешним ключом во второй таблице, но не определяет никаких исключительных ограничений внешнего ключа в определении таблицы.Может быть несколько записей во второй таблице для каждой записи в первой таблице. Я пытаюсь реализовать это с помощью SPringBoot-JPA-Hibernate, но не могу этого сделать.Может ли какое-то тело помочь мне здесь.Вот подробности: -
У меня есть таблица USER_CREDENTIAL со следующими полями: -
CREATE TABLE `INSTITUTION_USER_CREDENTIAL` (
`INSTITUTION_USER_ID INT(10) NOT NULL, -> AutoGeneratd
`INSTITUTION_USER_NAME` VARCHAR(50) NOT NULL,
`INSTITUTION_USER_PASSWORD` VARCHAR(50) NOT NULL,
`FIRST_NAME` VARCHAR(100) NOT NULL,
`MIDDLE_NAME` VARCHAR(100),
`LAST_NAME` VARCHAR(100) NOT NULL,
PRIMARY KEY (`INSTITUTION_USER_ID`,`INSTITUTION_USER_NAME`)
);
2) Вот моя вторая таблица
CREATE TABLE `INSTITUTION_USER_CREDENTIAL_MASTER` (
`INSTITUTION_ID` INT(10) NOT NULL, -> Autogenerated
`INSTITUTION_USER_ID` INT(10) NOT NULL, -> Coming from
INSTITUTION_USER_CREDENTIAL
`INSTITUTION_USER_ROLE` CHAR(02) NOT NULL,
`INSTITUTION_USER_STATUS` CHAR(02) NOT NULL,
`INSTITUTION_NAME` VARCHAR(200) NOT NULL,
`LAST_UPDT_ID` VARCHAR(100) NOT NULL,
`LAST_UPDT_TS` DATETIME NOT NULL,
PRIMARY KEY(`INSTITUTION_ID`,`INSTITUTION_USER_ID`,`INSTITUTION_USER_ROLE`)
);
Обратите внимание, что яне объявлять какой-либо конкретный внешний ключ во второй таблице.У меня есть два класса @Embeddable, соответствующие структуре двух первичных ключей для двух разных таблиц: -
Для таблицы INSTITUTION_USER_CREDENTIAL: -
@Embeddable
public class InstitutionUserCredentialPrimaryKey implements Serializable{
private static final long serialVersionUID = 1L;
@Column(name = "INSTITUTION_USER_ID")
@GeneratedValue(strategy=GenerationType.AUTO)
private int institutionUserId;
@Column(name = "INSTITUTION_USER_NAME")
private String institutionUserName;
//Getter-Setters removed for clarity
}
Соответствующий класс сущностей: -
@Entity(name = "INSTITUTION_USER_CREDENTIAL")
public class InstitutionUserCredential {
@EmbeddedId
private InstitutionUserCredentialPrimaryKey
institutionUserCredentialPrimaryKey;
@Column(name = "INSTITUTION_USER_PASSWORD")
private String instituteUserPassword;
@Column(name = "FIRST_NAME")
private String firstname;
@Column(name = "MIDDLE_NAME")
private String middleName;
@Column(name = "LAST_NAME")
private String lastName;
@OneToMany(mappedBy="institutionUserCredential", cascade = CascadeType.ALL)
private List<InstitutionUserCredentialMaster>
institutionUserCredentialMaster;
//Getter-Setter and other part of the code removed for clarity
}
Для таблицы INSTITUTION_USER_CREDENTIAL_MASTER: -
@Embeddable
public class InstituteUserCredentialMasterPrimaryKey implements Serializable
{
private static final long serialVersionUID = 1L;
@Column(name = "INSTITUTION_ID")
@GeneratedValue(strategy=GenerationType.AUTO)
private int institutionId;
@Column(name = "INSTITUTION_USER_ID")
private int institutionUserId;
@Column(name = "INSTITUTION_USER_ROLE")
private String userRole;
//Getter-Setter and other part of the code removed for clarity
}
Класс сущности: - *
@Entity(name = "INSTITUTION_USER_CREDENTIAL_MASTER")
public class InstitutionUserCredentialMaster {
@EmbeddedId
private InstituteUserCredentialMasterPrimaryKey
instituteUserCredentialMasterPrimaryKey;
@Column(name = "INSTITUTION_USER_STATUS")
private String userStatus;
@Column(name = "INSTITUTION_NAME")
private String institutionName;
@Column(name = "LAST_UPDT_ID")
private String lastUpdateId;
@Column(name = "LAST_UPDT_TS")
private String lastUpdateTimestamp;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name="institutionUserId", referencedColumnName =
"INSTITUTION_USER_ID")
})
private InstitutionUserCredential institutionUserCredential;
//Getter-Setter and other part of the code removed for clarity
}
Обратите внимание, что только 1 поле INSTITUTION_USER_ID используется в Composite PrimaryKey InstitutionUserCredentialMaster и являетсяисходя из составного первичного ключа InstitutionUserCredential.
Когда я запускаю свой код, это выдает мне ошибку типа: -
Invocation of init method failed; nested exception is
org.hibernate.AnnotationException:
referencedColumnNames(INSTITUTION_USER_ID) of com.bnl.application.entity.InstitutionUserCredentialMaster.institutionUserCredential referencing com.bnl.application.entity.InstitutionUserCredential not mapped to a single property
Ни один из примеров, которые я видел до сих порсоставной первичный ключ и внешний ключ не относятся к какому-либо одному конкретному полю и являются большей частью всей структуры ключа.Я использую MYSQL и проверил, что мы можем создать таблицу, имеющую составной первичный ключ, и одно из полей этого составного ключа является внешним ключом в другой таблице, а также частью составного первичного ключа второй таблицы.
Любые указатели оценили
ОБНОВЛЕНИЕ: - В своем первом посте я сделал ошибку при публикации.Я сожалею, что institutionUserName
стал частью InstitutionUserCredentialMaster
.это была опечатка.В таблице InstitutionUserCredentialMaster
не существует intitutionUserName
.я исправил это и обновил сообщение.
***** Обновление на основе ввода Нивера и Веги *****
Обновление до InstitutionUserCredentialMasterPrimaryKey
@Embeddable
открытый класс InstituteUserCredentialMasterPrimaryKey реализует Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "INSTITUTION_ID")
@GeneratedValue(strategy=GenerationType.AUTO)
private int institutionId;
@Column(name = "INSTITUTION_USER_ID")
private int institutionUserId;
// Added the institutionUserName
@Column(name = "INSTITUTION_USER_NAME")
private String institutionUserName;
@Column(name = "INSTITUTION_USER_ROLE")
private String userRole;
}
Обновление до класса сущности InsstitutionUserCredentialMaster: - *
@Entity(name = "INSTITUTION_USER_CREDENTIAL_MASTER")
открытый класс InstitutionUserCredentialMaster {
@EmbeddedId
private InstituteUserCredentialMasterPrimaryKey instituteUserCredentialMasterPrimaryKey;
@Column(name = "INSTITUTION_USER_STATUS")
private String userStatus;
@Column(name = "INSTITUTION_NAME")
private String institutionName;
@Column(name = "LAST_UPDT_ID")
private String lastUpdateId;
@Column(name = "LAST_UPDT_TS")
private String lastUpdateTimestamp;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name="institutionUserId", referencedColumnName = "INSTITUTION_USER_ID"),
@JoinColumn(name="institutionUserName",referencedColumnName = "INSTITUTION_USER_NAME")
})
private InstitutionUserCredential institutionUserCredential;
}
На этот разя получаю сообщение об ошибке типа
Invocation of init method failed; nested exception is org.hibernate.DuplicateMappingException: Table [institution_user_credential_master] contains physical column name [institution_user_id] referred to by multiple physical column names: [institutionUserId], [INSTITUTION_USER_ID]