2016-11-15 2 views
0

В моем объекте есть поле с именем id, помеченное аннотацией @Id (которое я установил вручную) и знаю, что я хотел знать, есть ли возможность автоматически генерировать уникальный идентификатор (с @ GeneratedValue), но я также хочу установить идентификатор вручную, а когда он не установлен, он должен генерировать его автоматически.JPA @GeneratedValue и @Id

Пример:

@Id 
@GeneratedValue 
private long id; 

создание объекта

new Entity(someid) //Once with ID and no generated value 
new Entity() //Second without ID and generated unique value 

Я надеюсь, что вы можете понять меня.

+1

Пожалуйста, объясните, как «длинное» поле может быть «не установлено»? Если бы это был Длинный, тогда я мог бы понять, но недолго. –

ответ

2

Ну, я не думаю, что это сработает. JPA автоматически генерирует ваше значение id и отвечает за @GeneratedValue. Спросите себя: «Что произойдет, если уже существует существующий объект с идентификатором 100. И я создаю вручную новый объект с идентификатором 100». Интуитивно я бы сказал, что JPA (или реализация) выдает искушение.

При написании выше ответ, который я получил идею написания собственного генератора (не пробовал на всех, просто закодированы здесь на StackOverflow.

Вы можете передать свою собственную реализацию генератора к @GeneratedValue аннотацию

@Id 
@GeneratedValue(startegy = GenerationType.IDENTITY, generator="generatedIdOrCustomId") 
@GenericGenerator(name="generatedIdOrCustomId", strategy="GeneratedIdOrCustomId") 
private Long id; 
... 

И обычай реализация должна выглядеть следующим образом:

public class GeneratedIdOrCustomId extends IdentityGenerator { 

@Override 
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException { 
    if (((YourEntity) obj).getId() == null) { 
     // the id is null, let JPA create an id. 
     return super.generate(session, obj); 
    } else { 
     // the id is set and should not be generated by JPA. 
     return ((YourEntity) obj).getId(); 
    } 
} 

генерировать м Этод - это простое и грязное воплощение. Вам нужно будет проверить, например, также, если obj == null и бросить (Hibernate)Exception в этом случае.

+0

Хорошо, возникла бы проблема. Благодарю. –

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