Как получить Eclipselink Entity Manager? - PullRequest
2 голосов
/ 22 ноября 2011

Я работаю над Java-проектом C / S и пытаюсь использовать Eclipselink для ORM (клиентская кеш-база данных, derby). Сделать запрос с примерами и выражениями довольно просто, но когда дело доходит до вставки / обновления, я обнаружил, что следует использовать Entity Manager (я новичок в java ORM, может быть, есть другой способ?). Когда я пытаюсь создать их, он всегда выдает исключение, которое говорит мне, что мне нужен сеанс сервера (то есть не удается найти единицу персистентности по имени). Когда я использую сессионный компонент и аннотацию @PersistenceUnit, он возвращает значение Null.

Я сделал несколько глупых ошибок? Или есть ли простой способ обновить / вставить значения? Я предположил, что может быть что-то вроде session.save (Object) или что-то подобное, что может сделать эту работу простой.

РЕДАКТИРОВАТЬ: я пытался использовать UnitOfWork, но получаю ошибку «Попытка изменить столбец идентификаторов», должен ли я изменить файл карты или что-то, что заставляет Eclipselink распознавать идентификатор PK?

@ GeneratedValue (стратегии = GenerationType.IDENTITY)

Добавить эту строку в POJO не работают.

РЕДАКТИРОВАТЬ : Я пытался использовать Единицу работы, чтобы вставить значение, вот код

    SessionFactory sessionFactory = new SessionFactory("default");
    Session session = sessionFactory.getSharedSession();
    UnitOfWork uow = session.acquireUnitOfWork();
    SysUser usr2 = new SysUser();
    usr2.setUserName("test");
    usr2.setUserPassword("test");
    uow.registerObject(usr2);
    uow.commit();

Но это приводит к

Internal Exception: java.sql.SQLSyntaxErrorException: Attempt to modify an identity column 'DB_ID'.

вот аннотация, которую я использовал:

@Column(name = "DB_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
protected int dbId;

А для EntityManager:

<persistence-unit name="my-app-name">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:/app/jdbc/jdbc/ConnectionDerbyDS</jta-data-source>

1 Ответ

8 голосов
/ 22 ноября 2011

Когда вы используете EclipseLink (через JPA API) в приложении Java SE, вам нужно настроить вещи немного иначе, чем когда ваше приложение состоит из компонентов, работающих в контейнере Java EE.

Вы получаете EntityManager с такими строками:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-app");
EntityManager em = emf.createEntityManager();

И ваше приложение должно иметь файл persistence.xml в каталоге META-INF файла JAR вашего приложения. Вы настраиваете JPA в этом файле; Вещи, которые вы помещаете туда, сообщают Java, какой поставщик сохраняемости следует использовать и каковы параметры соединения для вашей базы данных.

Имя единицы сохраняемости ("my-app" в примере выше) должно совпадать с именем, указанным в элементе persistence-unit в persistence.xml.

См. этот пример EclipseLink , который показывает, как должен выглядеть ваш persistence.xml.

EntityManager содержит такие методы, как persist(Object), которые можно использовать для сохранения сущностей в базе данных (см. в этих примерах , показывающих, как использовать EntityManager).

Ваш объект POJO должен иметь столбец, который будет содержать идентификатор объекта, и он должен иметь конструктор без аргументов:

@Entity
public class Example {

    @Id
    @GeneratedValue
    private long id;

    // ... Add other properties here

    // Required no-args constructor
    public Example() {
    }

    // ... Add getters and setters here
}

Добавление

Вы можете сохранить объект в базе данных, используя EntityManager, как показано в следующем коде. Не нужно использовать UnitOfWork (насколько я знаю, UnitOfWork - это то, что вам нужно при использовании более старого API JPA 1.0; вам не нужно это для JPA 2.0):

entityManager.getTransaction().begin();
entityManager.persist(myEntity);
entityManager.getTransaction().commit();
...