OpenJPA HSQLdb - как обрабатывать идентификаторы - PullRequest
1 голос
/ 01 июня 2010

У меня проблемы с обработкой идентификаторов моих таблиц базы данных с использованием OpenJPA и HSQLdb. Я создал класс Abstract, где я обрабатываю аннотации и прочее, чтобы переназначить их в БД:

// Property accessors
    @Id
    @Column(name = "IDTESTOBJEKT", unique = true, nullable = false)
    public Integer getIdtestobjekt() {
        return this.idtestobjekt;
    }

    public void setIdtestobjekt(Integer idtestobjekt) {
        this.idtestobjekt = idtestobjekt;
    }

Это как фасад, используемый для создания тестобъектов.

Testobjekt test_obj = new Testobjekt();
test_obj.setEigentuemerin("helge");
// test_obj.setIdtestobjekt(1);

EntityManagerHelper.beginTransaction();
TestobjektDAO test_dao = new TestobjektDAO();
test_dao.save(test_obj);
EntityManagerHelper.commit();

List<Testobjekt> foo;

foo = test_dao.findByEigentuemerin("helge");

Testobjekt from_db  = foo.get(0);
System.out.println(from_db.getEigentuemerin()); 

Тем не менее, что я установил ... 1, ничего ... Я получаю ошибки. Нравится:

Field "model_layer.AbstractTestobjekt.idtestobjekt" of "model_layer.Testobjekt@3209fa8f" can not be set to "null" value.

Я хочу, чтобы слой ORM обрабатывал эти идентификаторы, не беспокоя меня. Мой опыт работы с Hibernate в том, что он справляется с этим довольно хорошо ... но OpenJPA кажется здесь громоздким. Я предполагаю, что мои аннотации неправильные или что-то в этом роде, но мне не удается отследить эту многоуровневую проблему.

Я настроил OpenJPA в файле persistence.xml:

<persistence-unit name="HSQLdb_mvn_openJPA_autoTablesPU"
        transaction-type="RESOURCE_LOCAL">
        <provider>
            org.apache.openjpa.persistence.PersistenceProviderImpl
        </provider>
        <class>model_layer.Testobjekt</class>
        <class>model_layer.AbstractTestobjekt</class>
        <properties>
            <property name="openjpa.ConnectionDriverName"
                value="org.hsqldb.jdbc.JDBCDriver" />
            <property name="openjpa.ConnectionURL"
                value="jdbc:hsqldb:hsql://localhost:9001/mydb" />
            <property name="openjpa.ConnectionUserName" value="SA" />
            <property name="openjpa.jdbc.SynchronizeMappings"
                value="buildSchema(ForeignKeys=true)" />
        </properties>
    </persistence-unit>

Как мне справиться с автоматизированной стратегией идентификации с OpenJPA?

Спасибо, wishi

1 Ответ

2 голосов
/ 01 июня 2010

Как мне справиться с автоматизированной стратегией идентификации с OpenJPA?

Используйте аннотацию @GeneratedValue (и я предлагаю использовать стратегию GenerationType.AUTO по умолчанию, которая указывает, что поставщик сохраняемости должен выбрать подходящую стратегию для конкретной базы данных ):

@Id 
@GeneratedValue
@Column(name = "IDTESTOBJEKT", unique = true, nullable = false)
public Integer getIdtestobjekt() {
    return this.idtestobjekt;
}
...