2016-09-28 2 views
0

У меня есть два объекта, у которых есть аннотированный идентификатор, но эти идентификаторы являются первичными ключами в таблицах. Я все еще сопоставляю 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; 

Кто-нибудь знает, если это вообще возможно? или я буду вынужден обновлять содержимое в таблице ассоциации, когда я нажимаю это изменение?

ответ

0
  • поставил @Id и @GeneratedValue на поле, которые представляют данные таблицы, то зимовать будет отображать длинный (SGBD) йота длинный (таблица)

или

  • ваш (sgbd) тип данных таблицы должен быть совместим с типом (java) uuid.

Почему эти 2 ключа на вашем столе?

Я думаю, что невозможно иметь 2 ПК для одного объекта. В большинстве случаев у вас может быть составная база ключей на вашем serialID и UUID.

см How to map a composite key with Hibernate? для этого

Или пометить как @Id реальный PK в SGBD. Используйте другие в Java как классическое значение в точке стола зрения

+0

Я не хочу выставлять столбец последовательного идентификатора, так как это риск для безопасности, и чтобы избежать удара по производительности для использования UUID в качестве ПК, я хотел сохранить серийный идентификатор в качестве ПК. Серийный идентификатор все еще отображается на объект, поэтому я могу выполнять эту работу поэтапно, но я не хочу, чтобы это был идентификатор объекта. – peekay

+0

если я правильно понимаю, вы не хотите разрешать модификацию id? см. Http://stackoverflow.com/a/2217064/2710704 – Tokazio

+0

Я изначально использовал последовательный Id везде.Теперь после аудита безопасности я конвертирую в UUID, но я не хочу использовать UUID как ПК из-за потенциальных проблем с производительностью. – peekay

0

Решения, которое я решил пойти с следующий:

@ManyToOne 
@JoinColumns (value = { 
    @JoinColumn(name = "user_id", insertable = false, updatable = false, referencedColumnName = "user_id"), 
    @JoinColumn(name = "user_uid", insertable = false, updatable = false, referencedColumnName = "uid") 
}) 
private Customer customer; 

В двух словах я просто добавил UUID в таблицу ассоциации и использовали оба столбца для объекта Customer.

Для решения вопроса @ Tokazio об использовании UUID и последовательного идентификатора, преобразование хранилища данных существенно влияет на меня, поэтому мне нужно медленно перемещаться из последовательного идентификатора в UUID, чтобы минимизировать воздействие и предотвращать перебои в работе.

Смежные вопросы