Как я могу заставить Hibernate сделать однонаправленное картирование многотононового без использования первичного ключа?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу заставить Hibernate сделать однонаправленное картирование многотононового без использования первичного ключа?

Сообщение Anonymous »

У нас есть структура таблицы, как это: < /p>

Код: Выделить всё

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>
Мы хотели отобразить такие объекты, как SO: < /p>
@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,
)
}
Но когда мы пытались использовать эти сопоставления и сохранить клиент с новым членом , возникает эта ошибка:

орг.bhibernate.engine.jdbc.spi.sqlexceptionHelper: не удается добавить или обновить строку ребенка: ограничение иностранного ключа не удается (

Код: Выделить всё

client_member
, ограничение client_member_ibfk_1 Иностранный ключ (

Код: Выделить всё

member_key
) ссылки член ())

После отладки мы обнаружили, что это то, что Hibernate пытался выполнить:

Код: Выделить всё

INSERT INTO `client_member` (`client_id`, `member_key`) VALUES (14, 183)
< /code>
183
является идентификатором члена, но ключ-C90BCFD6-86BE-4EC4-8E16-2A541CE87317 . Похоже, что Hibernate игнорирует ссылочное количество имени и все еще пытается пройти в ID вместо ключа члена .
< P> Есть ли способ исправить это без необходимости добавления картирования клиентов в объект , делающую это двунаправленное? Мы хотели бы сохранить его однонаправленным, если это возможно,

Подробнее здесь: https://stackoverflow.com/questions/794 ... ut-using-t
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»