JPA Сериализация - PullRequest
       0

JPA Сериализация

1 голос
/ 16 сентября 2011

Я работаю с JPA 2.0-EclipseLink-Hibernate 3 на MySQL 5. Моя структура классов похожа на приведенную ниже (я упростила ее)

public class Status implements Serialization {
    private String name = null;

    public Status(string n) {
        this.name = n;
    }

    @Override
    public String toString() {
        return this.name;
    }
}

@Entity
@Table(name="ACCOUNT")
public class Account {

    public static final Status ACTIVE = new Status("AC");
    public static final Status DISABLE = new Status("DI");

    private Status status = null;
    private long id = 0;

    public Account(long id, Status s) {
        this.id = id;
        this.status = s;
    }

    @Id
    @Column(name="id")
    public long getId() {
        return this.id;
    }

    public setId(long id) {
        this.id = id;
    }

    @Column(name="status")
    public Status getStatus() {
        return this.status;
    }

    public setStatus(Status s) {
        this.status = s;
    }
}

Теперь мой вопрос: когда я вставляю новуюПри использовании EntityManager.persist программа выдает исключение:

java.sql.SQLException: неверное строковое значение: '\ xAC \ xED \ x00 \ x05sr ...' для столбца 'status' встрока 1

И после того, как я вручную добавил новую учетную запись в базу данных, затем выбрал ее, программа говорит:

Исключение Описание: Не удалось десериализовать объект из байтамассив.Внутреннее исключение: java.io.EOFException Отображение: org.eclipse.persistence.mappings.DirectToFieldMapping [status -> ACCOUNT.status] Дескриптор: RelationalDescriptor (net.serenco.serenekids.model.bean.account.Account -> [DatabaseTable)(ACCOUNT)])

Пожалуйста, скажите мне, как контролировать, какое значение будет записано в БД, и, кстати, пожалуйста, помогите мне исправить эти ошибки.Заранее спасибо!

---------------- РЕДАКТИРОВАТЬ ----------------

Мне удалось найти решение самостоятельно.Это:

@Embeddable
public class Status implements Serialization {
    ...

    protected String getName() {
        return name;
    }

    protected void setName(String name) {
        this.name = name;
    }
}

@Entity
@Table(name="ACCOUNT")
public class Account {
    ...
    @Embedded
    @AttributeOverrides( {
            @AttributeOverride(name="name", column = @Column(name="status") )
    } )
    public Status getStatus() {
        return this.status;
    }
    ...
}
...