У меня есть два объекта, у которых есть аннотированный идентификатор, но эти идентификаторы являются первичными ключами в таблицах. Я все еще сопоставляю PK с сущностью на данный момент, чтобы ограничить первоначальный эффект изменения. Но таблица ассоциации, которая использует ПК, чтобы ассоциировать многие ко многим бросает следующее сообщение об ошибке:Таблицы ассоциации Hibernate
java.lang.IllegalArgumentException: Provided id of the wrong type for class. Expected: class java.util.UUID, got class java.lang.Long
Субъект @Id является UUID, но таблица PK, который длинный отображается как @JoinColumn
Составной ключ для объединения объекта
@Embeddable
public class CustomerAccountId implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "user_id", nullable = false)
private Long customerId;
@Column(name = "account_id", nullable = false)
private Long accountId;
ассоциация объект:
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "customerId", column = @Column(name = "user_id", nullable = false)),
@AttributeOverride(name = "accountId", column = @Column(name = "account_id", nullable = false))
})
private CustomerAccountId id;
@ManyToOne
@JoinColumn(name = "user_id", insertable = false, updatable = false, referencedColumnName = "user_id")
private Customer customer;
@ManyToOne
@JoinColumn(name = "account_id", insertable = false, updatable = false, referencedColumnName = "id")
private Account account;
Неисправный объект:
@Column(name = "user_id")
private Long serialId; // also the primary key in the table
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@org.hibernate.annotations.Type(type="pg-uuid")
@Column(name = "uid", updatable = false)
private UUID id;
Кто-нибудь знает, если это вообще возможно? или я буду вынужден обновлять содержимое в таблице ассоциации, когда я нажимаю это изменение?
Я не хочу выставлять столбец последовательного идентификатора, так как это риск для безопасности, и чтобы избежать удара по производительности для использования UUID в качестве ПК, я хотел сохранить серийный идентификатор в качестве ПК. Серийный идентификатор все еще отображается на объект, поэтому я могу выполнять эту работу поэтапно, но я не хочу, чтобы это был идентификатор объекта. – peekay
если я правильно понимаю, вы не хотите разрешать модификацию id? см. Http://stackoverflow.com/a/2217064/2710704 – Tokazio
Я изначально использовал последовательный Id везде.Теперь после аудита безопасности я конвертирую в UUID, но я не хочу использовать UUID как ПК из-за потенциальных проблем с производительностью. – peekay