Wie kann ich den Winterschlaf dazu bringen, eine unidirektionale Kartierung zu machen, ohne den Primärschlüssel zu verwe
Posted: 13 Feb 2025, 06:36
Wir haben eine Tabellenstruktur wie folgt: < /p>
Aber als wir versucht haben, diese Zuordnungen zu verwenden und Client mit einem neuen Mitglied zu speichern, tritt dieser Fehler auf:
org.hibernate.engine.jdbc.spi.sqlexceptionHelper: Eine untergeordnete Zeile kann nicht hinzufügen oder aktualisieren: Eine fremde Schlüsselbeschränkung schlägt fehl (fehl, Constraint Client_Member_ibfk_1 Fremdstahl (Fremdstadium () Referenzen Mitglied ())
Nach dem Debuggen haben wir festgestellt class = "Lang-SQL PrettyPrint-Override"> ist die ID des Mitglieds, aber der Schlüssel ist C90BCFD6-86BE-4EC4-8E16-2A541CE87317 . Es scheint, dass Hibernate den ReferenzColumnName ignoriert und immer noch versucht, die ID anstelle des Schlüssels des Mitglieds zu übergeben.
Gibt es eine Möglichkeit, dies zu beheben, ohne dem Mitglied Entität eine Zuordnung von Clients hinzufügen zu müssen? Wir möchten es nach Möglichkeit unidirektional halten
Code: Select all
CREATE TABLE `client` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `member` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`key` varchar(255) NOT NULL,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY (`key`)
);
CREATE TABLE `client_member` (
`client_id` bigint NOT NULL,
`member_key` varchar(255),
UNIQUE KEY `client_id` (`client_id`,`user_key`),
FOREIGN KEY (`client_id`) REFERENCES `client` (`id`),
FOREIGN KEY (`member_key`) REFERENCES `member` (`key`)
);
< /code>
Wir wollten die Entitäten wie SO: < /p>
abbilden@Entity
@Table(name = "client")
class Client(
@Id
@Access(AccessType.PROPERTY)
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false, updatable = false)
var id: Long?,
@Column(name = "name", nullable = false)
var name: String,
@ManyToMany
@JoinTable(
name = "client_member",
joinColumns = [JoinColumn(
name = "client_id",
referencedColumnName = "id",
nullable = false
)],
inverseJoinColumns = [JoinColumn(
name = "member_key",
referencedColumnName = "key",
nullable = false
)]
)
var clientMembers: MutableSet,
)
@Entity
@Table(name = "member")
class Member(
@Id
@Access(AccessType.PROPERTY)
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false, updatable = false)
var id: Long?,
@NaturalId
@Column(name = "key", unique = true, nullable = false, updatable = false)
var key: String,
@Column(name = "name", nullable = false)
var name: String,
)
@Entity
@Table(name = "client_member")
class ClientMember(
@EmbeddedId
var id: ClientMemberCompositeKey
) {
@Embeddable
class ClientMemberCompositeKey(
@ManyToOne
@JoinColumn(
name = "client_id",
referencedColumnName = "id",
nullable = false
)
var client: Client,
@ManyToOne
@JoinColumn(
name = "member_key",
referencedColumnName = "key",
nullable = false
)
var member: Member,
)
}
org.hibernate.engine.jdbc.spi.sqlexceptionHelper: Eine untergeordnete Zeile kann nicht hinzufügen oder aktualisieren: Eine fremde Schlüsselbeschränkung schlägt fehl (fehl
Code: Select all
client_member
Code: Select all
member_key
Code: Select all
key
Nach dem Debuggen haben wir festgestellt class = "Lang-SQL PrettyPrint-Override">
Code: Select all
INSERT INTO `client_member` (`client_id`, `member_key`) VALUES (14, 183)
< /code>
183
Gibt es eine Möglichkeit, dies zu beheben, ohne dem Mitglied Entität eine Zuordnung von Clients hinzufügen zu müssen? Wir möchten es nach Möglichkeit unidirektional halten