2012-02-02 2 views
0

Это похоже на сообщение, которое я видел перед этим исключением, но я полностью потерян. Мне еще нужно сохранить сущность в базе данных с помощью JPA, хотя я прочитал ее из таблиц без проблем. Моя настройка - Netbeans 7.1 с использованием Glassfish 3.1.1, EclipseLink - мой поставщик персистентности. У меня очень простой сценарий, когда я просто хочу проверить, записывать ли имя и возраст людей в базу данных и иметь автоматическое увеличение id. Его база данных MySql с полями: Id, FirstName и Age. Heres мой код:Объект: entity.ENTITY [id = null] не является известным типом объекта

Web сервлет принять имя и возраст от формы HTML:

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 

    String userPath = request.getServletPath(); 

    if(userPath.equals("/addUser")){ 

     //get request parameters from form 
     String name = request.getParameter("name"); 
     String age = request.getParameter("age"); 

     //set request attributes to be used by forwarded page 
     request.setAttribute("name", name); 
     request.setAttribute("age", age); 

     //create manager class to add person to database 
     Manager manager = new Manager(); 
     manager.addPerson(name, age); 

     userPath = "/result"; 
    } 

    // use RequestDispatcher to forward request internally 
    String url = "/WEB-INF/view" + userPath + ".jsp"; 

    try { 
     request.getRequestDispatcher(url).forward(request, response); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

класса менеджер, который принимает имя и возраст, создает объект человека и сохраняется его.

public class Manager { 

private static final String PERSISTENCE_UNIT_NAME = "FormPU"; 
private static EntityManagerFactory factory; 

public Manager() { 
} 

public void addPerson(String name, String age) { 

    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 
    EntityManager em = factory.createEntityManager(); 

    Persons persons = new Persons(); 
    persons.setName(name); 
    persons.setAge(age); 

    em.getTransaction().begin(); 
    em.persist(persons); 
    em.getTransaction().commit(); 
    em.close(); 
} 
} 

Лица Класс сущности:

/** 
    * 
    * @author esmiala 
    */ 
    @Entity 
    @Table(name = "persons") 
    @XmlRootElement 
    @NamedQueries({ 
     @NamedQuery(name = "Persons.findAll", query = "SELECT p FROM Persons p"), 
     @NamedQuery(name = "Persons.findById", query = "SELECT p FROM Persons p WHERE 
     p.id = :id"), 
     @NamedQuery(name = "Persons.findByFirstName", query = "SELECT p FROM Persons p 
     WHERE p.firstName = :firstName"), 
     @NamedQuery(name = "Persons.findByAge", query = "SELECT p FROM Persons p WHERE 
     p.age = :age")}) 
public class Persons implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@NotNull 
@Column(name = "Id") 
private Integer id; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 255) 
@Column(name = "FirstName") 
private String firstName; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 255) 
@Column(name = "Age") 
private String age; 

public Persons() { 
} 

public Persons(Integer id) { 
    this.id = id; 
} 

public Persons(Integer id, String firstName, String age) { 
    this.id = id; 
    this.firstName = firstName; 
    this.age = age; 
} 

public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getAge() { 
    return age; 
} 

public void setAge(String age) { 
    this.age = age; 
} 

@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (id != null ? id.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object object) { 
    // TODO: Warning - this method won't work in the case the id fields are not set 
    if (!(object instanceof Persons)) { 
     return false; 
    } 
    Persons other = (Persons) object; 
    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return "entity.Persons[ id=" + id + " ]"; 
} 

}

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com 
    /xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="FormPU" transaction-type="JTA"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>jdbc/form</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties/> 
    </persistence-unit> 
    </persistence> 

Примечание: Я также попытался установить исключения-UNLISTED-классы тег истинны и список класс отдельно, но это тоже не сработало.

Исключение:

WARNING: StandardWrapperValve[Controller]: PWC1406: Servlet.service() for servlet 
    Controller threw exception 
    java.lang.IllegalArgumentException: Object: entity.persons[ id=null ] is not a 
    known entity type. 
atorg.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObject 
    ForPersist(UnitOfWorkImpl.java:4141) 
atorg.eclipse.persistence.internal.jpa.EntityManagerImpl. 
    persist(EntityManagerImpl.java:368) 
at manager.Manager.addPerson(Manager.java:36) 
at controller.Controller.doPost(Controller.java:70) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 

... и так далее. Любая помощь будет принята с благодарностью!

ответ

1

<exclude-unlisted-classes> не работает, как и следовало ожидать - само присутствие этого элемента в persistence.xml отключает автоматическое обнаружение классов @Entity, независимо от того, что внутри него.

Кроме того, @Entity(name="persons"), вероятно, не то, что вы хотите, вместо этого используйте @Entity @Table (name="persons").

+0

Я удалил класс сущности и файл xistence persistence и сгенерировал новые, используя классы объектов Netbeans Entity Classes из базы данных. Он производит следующее, но все равно не работает. Ill изменить в новом классе сущности ... –

1

Итак, вы говорите, что можете отлично читать класс, но получить ошибку, сохраняющую новый экземпляр?

Можете ли вы обновить объект, который вы прочитали?

Кажется, у вас есть проблема с загрузчиком класса. Так или иначе у вас есть класс на вашем пути к классу дважды, или у вас есть два разных загрузчика классов. Объект, который вы передаете, сохраняется с другого загрузчика классов, чем тот, который используется JPA. Вы можете проверить загрузчик классов того, что было прочитано, и объекта, который сохраняется, чтобы увидеть, как они отличаются.

Вы перераспределили приложение или заняли место? Работает ли это, если вы правильно завершаете/перезапускаете сервер. Перед повторным развертыванием убедитесь, что вы закрываете свой старый EntityManagerFactory.

+0

Привет, да, я перераспределил, перезапустил сервер и т. Д., Но ничего не работает. «Кажется, у вас какая-то проблема с загрузчиком класса. Почему-то у вас есть класс на пути к классу дважды или у вас есть два разных загрузчика классов. Объект, который вы передаете, сохраняется из другого загрузчика классов, чем тот, который используется JPA. Вы можете проверить загрузчик классов того, что было прочитано, и объекта, который сохраняется, чтобы увидеть, как они отличаются ». Можете ли вы вникать в это немного больше, я не уверен, что это значит. Он не собирает сущность вообще. –

0

Что касается конкретной проблемы, попробуйте выяснить, помогает ли это link.

В любом случае способ создания экземпляра EntityManager не является потокобезопасным.

Вы можете увидеть here почему.Или, лучше, вы можете использовать мастер NetBeans' для создания JPA классов контроллеров из классов сущностей, и посмотреть, как она впрыскивает EntityManager:

@PersistenceContext 
private EntityManager em; 

Смотрите также, что классы контроллеров (эквивалент вашей POJO Manager) имеет Stateless аннотация. Это связано с тем, что вы можете безопасно вводить EJB (в данном случае EntityManager) только в объект, чей жизненный цикл управляется веб-контейнером (см. here для получения дополнительной информации о доступе к Enterprise Beans).

+0

Спасибо за информацию, плохо посмотрите. –

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