2012-04-17 7 views
1

Я использую Ebean и определить такую ​​модель:Как позволить ebean не генерировать значения для ID?

@Entity 
@Table(name = "users") 
public class User extends Model { 

    @Id 
    public String id; 

    public String email; 

    public String name; 

} 

Вы можете увидеть поле id является String, и имеет @Id аннотацию.

Теперь я сохранить его:

User user = new User(); 
user.id = "abc"; 
user.email = "[email protected]"; 
Ebean.save(user); 

Но когда я спас его, я обнаружил, ценность это id является: 1, не abc я указал.

Я проверил SQL, нашел таблицу генерации:

create table users (
    id      varchar(255) not null, 
    email      varchar(255), 
    name      varchar(255), 
    constraint pk_users primary key (id)) 
; 

create sequence users_seq; 

Вы можете видеть, что есть след users_seq, который использовался при установке пользователя.

Как определить модель или как настроить Ebean, чтобы она ничего не делала с полем @Id? Просто позвольте мне использовать мое указанное значение?

===========

UPDATE

К сожалению, ребята, я нашел, что это странное поведение из-за моей ошибки!

Да, я использую его с playframework 1, и я попытался создать модуль play-ebean для себя. Но что-то не так: Когда я сохраняю модель, я сбросил значение id по ошибке!

Так что присвоенное значение abc отсутствует, то Ebean попытается использовать seq, чтобы получить новое значение для него.

Спасибо за все, что вам поможет, и, к сожалению, я буду более осторожен, когда задаю вопрос в следующий раз.

+0

@DataNucleus, так как Ebean следует за jpa, я думаю, что это может быть вопрос «JPA» – Freewind

+0

Это должна быть общая проблема, также я использую ее в игре сейчас. – Freewind

+0

Я говорю, что это вопрос «JPA», потому что в JPA могут быть некоторые аннотации, чтобы изменить это поведение, хотя я не знаю, есть ли :) – Freewind

ответ

3

Не лучше ли создавать другое уникальное поле и использовать его опционально, т.е. String userCode что ли?

Игра с Ebean использует автоматическое увеличение Id, чтобы убедиться, что идентификатор уникален, поэтому я лично не изменил его, так как все документы предполагают, что идентификатор модели является некоторым числовым.

Вы можете использовать маршруты Play для поиска пользователя по его строковому идентификатору и использовать Long id для выполнения основных операций.

(я пишу в контексте Play, как я предполагаю, что вы просите в нем;))

1

Вы должны расширить GenericModel вместо Model, если вы хотите работать на вашем собственном @Id поле. Я также говорю в контексте PlayFramework.

+0

Мне было интересно узнать о GenericModel, который вы предложили, однако 2.0 API не имеет такого класса в play.db.ebean, я что-то пропустил? – biesior

+0

GenericModel существует в Play 1.x. Я не уверен в API 2.0 –