2012-05-03 31 views
7

Dựa trên câu trả lời từ axtavt, đây gần như chắc chắn là một vấn đề đặt tên giữa Notebean và NoteBean. Có một quy ước cụ thể để làm theo ở đây, chỉ cần bình thường CamelCase?Loại lược đồ trừu tượng không xác định

Tôi tin rằng tôi đã cập nhật chú thích @NamedQuery trong thực thể và đang sử dụng chú thích từ bộ điều khiển và tên trông khớp, nhưng tôi vẫn nhận được lỗi tương tự về lược đồ mà tôi có thể ' t nhận được nhiều thông tin.

khiển JPA:

package net.bounceme.dur.nntp.controller; 

import java.util.*; 
import java.util.logging.Logger; 
import javax.mail.Message; 
import javax.persistence.*; 
import javax.swing.DefaultListModel; 
import net.bounceme.dur.nntp.model.NoteBean; 

public class NotesController { 

    private static final long serialVersionUID = 1L; 
    private static final Logger LOG = Logger.getLogger(NotesController.class.getName()); 
    private Message message; 
    private List<NoteBean> notes = new ArrayList<NoteBean>(); 
    private DefaultListModel defaultListModel = new DefaultListModel(); 
    private EntityManagerFactory emf; 
    private EntityManager em; 
    private String PERSISTENCE_UNIT_NAME = "nntpPU"; 

    public NotesController() { 
     emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 
     em = emf.createEntityManager(); 
     LOG.info("entity manager made???" + em.isOpen()); 
     populateList(); 
    } 

    private void populateList() { 
     LOG.info("open?" + em.isOpen()); 
     em.getTransaction().begin(); 
     LOG.info("trying to populate....."); 
     //Query q = em.createQuery("SELECT n FROM NoteBean n WHERE n.id = :id"); 
     Query q = em.createNamedQuery("NoteBean.findAll"); 
     LOG.info(q.toString()); 
     List results = q.getResultList(); 
     em.getTransaction().commit(); 
     setNotes(results); 
     DefaultListModel dlm = new DefaultListModel(); 
     for (NoteBean n : getNotes()) { 
      dlm.addElement(n); 
     } 
     setDefaultListModel(dlm); 
    } 

    public Message getMessage() { 
     return message; 
    } 

    public void addNote(NoteBean noteBean) { 
     LOG.info(noteBean.toString()); 
     em.getTransaction().begin(); 
     em.persist(noteBean); 
     em.getTransaction().commit(); 
     populateList(); 
    } 

    public void setMessage(Message message) { 
     this.message = message; 
    } 

    private List<NoteBean> getNotes() { 
     return notes; 
    } 

    private void setNotes(List<NoteBean> notes) { 
     this.notes = notes; 
    } 

    public DefaultListModel getDefaultListModel() { 
     return defaultListModel; 
    } 

    public void setDefaultListModel(DefaultListModel defaultListModel) { 
     this.defaultListModel = defaultListModel; 
    } 
} 

thực thể:

package net.bounceme.dur.nntp.model; 

import java.io.Serializable; 
import java.util.Date; 
import javax.persistence.*; 
import javax.xml.bind.annotation.XmlRootElement; 

@Entity 
@Table(name = "NOTEBEAN", catalog = "nntp", schema = "") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "NoteBean.findAll", query = "SELECT n FROM NoteBean n"), 
    @NamedQuery(name = "NoteBean.findById", query = "SELECT n FROM Notebean n WHERE n.id = :id"), 
    @NamedQuery(name = "NoteBean.findByStamp", query = "SELECT n FROM Notebean n WHERE n.stamp = :stamp"), 
    @NamedQuery(name = "NoteBean.findByNote", query = "SELECT n FROM Notebean n WHERE n.note = :note") 
}) 
public class NoteBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "ID", nullable = false) 
    private Long id; 
    @Column(name = "STAMP") 
    @Temporal(TemporalType.DATE) 
    private Date stamp; 
    @Column(name = "NOTE", length = 255) 
    private String note; 

    public NoteBean() { 
    } 

    public NoteBean(Long id) { 
     this.id = id; 
    } 

    public Long getId() { 
     return id; 
    } 

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

    public Date getStamp() { 
     return stamp; 
    } 

    public void setStamp(Date stamp) { 
     this.stamp = stamp; 
    } 

    public String getNote() { 
     return note; 
    } 

    public void setNote(String note) { 
     this.note = note; 
    } 

    @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 NoteBean)) { 
      return false; 
     } 
     NoteBean other = (NoteBean) 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 "net.bounceme.dur.nntp.model.Notebean[ id=" + id + " ]"; 
    } 
} 

thời gian chạy lỗi:

init: 
Deleting: /home/thufir/NetBeansProjects/SwingNNTP/build/built-jar.properties 
deps-jar: 
Updating property file: /home/thufir/NetBeansProjects/SwingNNTP/build/built-jar.properties 
Compiling 2 source files to /home/thufir/NetBeansProjects/SwingNNTP/build/classes 
warning: [options] bootstrap class path not set in conjunction with -source 1.5 
Note: /home/thufir/NetBeansProjects/SwingNNTP/src/net/bounceme/dur/nntp/controller/NotesController.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 
1 warning 
compile: 
run: 
May 03, 2012 7:23:05 AM net.bounceme.dur.nntp.PropertiesReader getProps 
INFO: NNTP.loadMessages... 
May 03, 2012 7:23:06 AM net.bounceme.dur.nntp.controller.MessagesEnum <init> 
INFO: starting controller.. 
[TopLink Info]: 2012.05.03 07:23:10.319--ServerSession(10922033)--TopLink, version: Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007)) 
Exception in thread "AWT-EventQueue-0" Local Exception Stack: 
Exception [TOPLINK-8034] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.EJBQLException 
Exception Description: Error compiling the query [NoteBean.findByNote: SELECT n FROM Notebean n WHERE n.note = :note]. Unknown abstract schema type [Notebean]. 
    at oracle.toplink.essentials.exceptions.EJBQLException.unknownAbstractSchemaType(EJBQLException.java:494) 
    at oracle.toplink.essentials.internal.parsing.ParseTreeContext.classForSchemaName(ParseTreeContext.java:163) 
    at oracle.toplink.essentials.internal.parsing.SelectNode.getClassOfFirstVariable(SelectNode.java:366) 
    at oracle.toplink.essentials.internal.parsing.SelectNode.getReferenceClass(SelectNode.java:354) 
    at oracle.toplink.essentials.internal.parsing.ParseTree.getReferenceClass(ParseTree.java:463) 
    at oracle.toplink.essentials.internal.parsing.ParseTree.adjustReferenceClassForQuery(ParseTree.java:103) 
    at oracle.toplink.essentials.internal.parsing.EJBQLParseTree.populateReadQueryInternal(EJBQLParseTree.java:127) 
    at oracle.toplink.essentials.internal.parsing.EJBQLParseTree.populateQuery(EJBQLParseTree.java:108) 
    at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:219) 
    at oracle.toplink.essentials.queryframework.EJBQLPlaceHolderQuery.processEjbQLQuery(EJBQLPlaceHolderQuery.java:111) 
    at oracle.toplink.essentials.internal.sessions.AbstractSession.processEJBQLQueries(AbstractSession.java:2059) 
    at oracle.toplink.essentials.internal.sessions.AbstractSession.processEJBQLQueries(AbstractSession.java:2046) 
    at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:724) 
    at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:604) 
    at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:280) 
    at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:229) 
    at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:93) 
    at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:126) 
    at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:120) 
    at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:91) 
    at net.bounceme.dur.nntp.controller.NotesController.<init>(NotesController.java:23) 
    at net.bounceme.dur.nntp.gui.Detail.<init>(Detail.java:20) 
    at net.bounceme.dur.nntp.gui.NewFrame.initComponents(NewFrame.java:30) 
    at net.bounceme.dur.nntp.gui.NewFrame.<init>(NewFrame.java:17) 
    at net.bounceme.dur.nntp.gui.NewFrame$2.run(NewFrame.java:62) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 
BUILD SUCCESSFUL (total time: 10 seconds) 

Chỉ cần để tham khảo, mysql console đầu ra:

mysql> describe nntp.NOTEBEAN; 
+-------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| ID | bigint(20) | NO | PRI | NULL |  | 
| STAMP | date   | YES |  | NULL |  | 
| NOTE | varchar(255) | YES |  | NULL |  | 
+-------+--------------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

mysql> 
mysql> select * from nntp.NOTEBEAN; 
Empty set (0.04 sec) 

mysql> 

Trả lời

8

Tên của lớp tổ chức của bạn (và, do đó, tên hợp lý mặc định của thực thể để sử dụng trong truy vấn) là NoteBean, trong khi stacktrace than phiền về Notebean.

Vì vậy, bạn nên sử dụng NoteBean thay vì Notebean trong các truy vấn của bạn:

@NamedQuery(name = "Notebean.findById", 
    query = "SELECT n FROM NoteBean n WHERE n.id = :id") 
+0

Tôi thích logic của bạn, nhưng tôi vẫn nhận được 'Unknown trừu tượng kiểu lược đồ [Notebean] .' với truy vấn đó. Chú thích '@ Table' thậm chí còn nghi ngờ hơn sau khi đọc những gì bạn đã chỉ ra về NoteBean so với Notebean. Tuy nhiên, kết quả tương tự. – Thufir

+0

@Thufir: Lưu ý rằng bạn nên thay đổi nó trong tất cả các truy vấn được đặt tên. – axtavt

+0

Tôi đã cập nhật câu hỏi để thử và khắc phục sự cố đặt tên. – Thufir

Các vấn đề liên quan