每当我尝试将列表设置为在IN表达式中使用的参数时,我都会得到一个Illegal参数异常.互联网上的各种帖子似乎表明这是可能的,但它肯定不适合我.我正在使用Glassfish V2.1和Toplink.
有没有其他人能够让这个工作,如果是这样的话怎么样?
这是一些示例代码:
List<String> logins = em.createQuery("SELECT a.accountManager.loginName " +
"FROM Account a " +
"WHERE a.id IN (:ids)")
.setParameter("ids",Arrays.asList(new Long(1000100), new Long(1000110)))
.getResultList();
Run Code Online (Sandbox Code Playgroud)
以及堆栈跟踪的相关部分:
java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.Arrays$ArrayList for parameter accountIds with expected type of class java.lang.Long from query string SELECT a.accountManager.loginName FROM Account a WHERE a.id IN (:accountIds). at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.setParameterInternal(EJBQueryImpl.java:663) at oracle.toplink.essentials.internal.ejb.cmp3.EJBQueryImpl.setParameter(EJBQueryImpl.java:202) at com.corenap.newtDAO.ContactDaoBean.getNotificationAddresses(ContactDaoBean.java:437) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1011) at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:175) at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2920) …
我将实体添加到我的数据库,它工作正常.但是当我检索List时,我得到了旧实体,我添加的新实体在我取消部署应用程序并再次重新部署之前不会显示.这意味着我的实体默认是缓存的吗?但是,我没有在persistence.xml或任何此类文件中对缓存实体进行任何设置.
我甚至尝试过调用flush(),refresh()和merge().但它仍然只显示旧实体.我错过了什么吗?请帮我.
我们正在使用JPA + Spring + EJB的Toplink实现.在我们的一个EJB中,我们有这样的东西:
public void updateUser(long userId, String newName){
User u = em.get(User.class, userId);
u.setName(newName);
// no persist is invoked here
}
Run Code Online (Sandbox Code Playgroud)
所以,基本上这个updateUser方法应该更新给定id的用户名.但是这个方法的作者忘了调用em.persist(u);
而最奇怪的是它运作良好.怎么会这样?我100%肯定,如果不调用em.persist()或em.merge(),就无法将更改保存到数据库中.他们可以吗?有可能发生这种情况吗?
谢谢
我正在使用JPA toplink-essential和SQL Server 2008
我的目标是获取将要插入表中的数据的自动增量主键值.我知道在JDBC中,有getInsertedId()方法,它给你自动增加主id的id(但是在执行insert语句之后)
在JPA中,我发现@GenratedValue annotation可以做到这一点.
@Entity
@Table(name = "tableOne")
public class TableOne implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "tableId")
private Integer tableId;
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行下面的代码,它应该给我自动增加的id 但它返回NULL ...
EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
EntityTransaction txn = em.getTransaction();
txn.begin();
TableOne parent = new TableOne();
em.persist(parent); //here I assume that id is pre-generated for me.
System.out.println(parent.getTableId()); //this returns NULL :(
Run Code Online (Sandbox Code Playgroud) 我正在使用EJB3和Oracle Express Edition DB构建J2SE应用程序.
我的问题就是这样 - 我在项目中设置了一个与数据库中的表匹配的EntityBean.该表包含一个不可为空的列,并具有默认值.我想要的是,当使用EJB将新数据持久化到此表时,列的值将获得其默认值.这是我在项目中设置的方式:
//holds user's first name
@Basic(optional = true)
@Column(name = "FIRST_NAME", insertable = false, updatable = true, nullable = false)
private String m_firstName;
Run Code Online (Sandbox Code Playgroud)
我还在ORM.XML文件中设置它:
<basic name="firstName">
<column name="FIRST_NAME" insertable="false" updatable="true" nullable="false"/>
</basic>
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,在创建新的EntityBean而不设置名字字段,然后尝试保留它时,我得到以下异常:
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01400: cannot insert NULL into ("TSDB"."USERS"."FIRST_NAME")
Run Code Online (Sandbox Code Playgroud)
这意味着持久性管理器尝试插入第一个名称字段,尽管我告诉它不要.
我在这里做错了吗?
谢谢!
我有一个以前工作的JPA项目.这个月,我在我的数据库中添加了一些数据.当我运行通常的工作(我曾经在前几个月运行)时,我收到此错误:
异常[TOPLINK-4002](Oracle TopLink Essentials - 2.0.1(Build b09d-fcs(12/06/2007))):oracle.toplink.essentials.exceptions.DatabaseException内部异常:java.sql.SQLException:网络错误IOException :地址已在使用中:连接错误代码:0
我检查了我的LocalPersistenceFacade,其中包含我正在调用的大多数方法,通过打印计数器,我得到了关闭和打开的连接的确切数量:457.然后我的工作崩溃了.通常,它应该到601而不是457.
在数据库方面,没有与可能的崩溃相关的信息.一切似乎都是正确的,但我的java代码却说了别的.
有人有任何想法吗?
问候,让
我正在尝试使用 JPA 对大型对象图进行级联保存。例如(我的对象图有点大但足够接近):
@Entity
@Table(name="a")
public class A {
private long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
private Collection<B> bs;
}
@Entity
@Table(name="b")
public class B {
private long id;
@ManyToOne
private A a;
}
Run Code Online (Sandbox Code Playgroud)
所以我试图保留一个包含 100 多个 B 的集合的 A。代码只是
em.persist(a);
Run Code Online (Sandbox Code Playgroud)
问题是,它很慢。我的保存大约需要 1300 毫秒。我查看了正在生成的 SQL,它的效率非常低。像这样的东西:
select a_seq.nextval from dual;
select b_seq.nextval from dual;
select b_seq.nextval from dual;
select b_seq.nextval from dual;
...
insert into a (id) values (1);
insert into b (id, fk) values (1, 1);
insert into …Run Code Online (Sandbox Code Playgroud) 我有一个DAO的集成测试,我在其中使用共享的EntityManager(通过Spring,使用SharedEntityManagerCreator).测试类标记为@Transactional,测试中的DAO方法也是如此.
在测试类和DAO中,我正在检索User实体,如下所示:
User user = em.find(User.class, "test");
Run Code Online (Sandbox Code Playgroud)
在我的测试设置中,我修改了用户对象,但是当测试开始运行时,我没有看到DAO中的修改.原来,这两个引用没有引用同一个对象; 我在我的测试类中证明了这一点:
System.out.println("User objects equal = " + (user == dao.getUser()));
Run Code Online (Sandbox Code Playgroud)
这打印出来的是假的.我希望每次使用相同密钥对EntityManager的调用都会返回相同的对象引用,并且很惊讶(并且有点惊慌!)发现情况并非如此.任何人都可以对此有所了解吗?我已经重构了我的代码,所以它实际上并不是一个问题(DAO不应该在其中包含User对象)但我仍然希望更好地理解它.
谢谢!
Java 1.6u22,Toplink Essentials 2.0.1,Spring 2.5.6
我想知道如何使用JPA(toplink essentials)从服务器到客户端处理实体类中的乐观锁版本属性,反之亦然.
这是场景.
从浏览器用户发送请求到服务器,要求编辑个人用户信息.
服务器处理请求并将结果返回给浏览器.服务器代码类似于:
EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
用户u =(用户)em.find(User.class,myUserId);
回报你; //回复浏览器
在这里,我的困惑是User表有"version"列optimistic locking.
这意味着版本字段的值也会被发送回客户端,即使客户端(我或任何人)永远不会使用它.版本字段将用于服务器端代码.
那么将版本号发送给客户端是否正确?因为否则我无法弄清楚如何检查版本号,以防用户点击带有修改数据的网页上的"更新"按钮.
如果您需要更多说明,请告诉我.
我正在为JPA使用Netbeans 6.9.1和TopLink Essentials.我已经按照JPA连接的必要步骤进行操作.
然而,当我在特定实体中执行命名查询时.这个例外总是回到我身边
NamedQuery of name: [the query name] not found.
Run Code Online (Sandbox Code Playgroud)
这怎么可能,我该如何解决这个问题呢?
我有 1 个实体调用 Item,我希望能够将父项链接到子项。使用连接表来创建父/子关系。我一直无法获得任何好的文档。因此,如果有人有任何想法,我会全神贯注。
这是我所拥有的......大部分时间都有效。
public class Item implements java.io.Serializable {
@Id
private Long id;
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinTable(name = "ITEMTOITEM", joinColumns = { @JoinColumn(name = "ITEMID") }, inverseJoinColumns = { @JoinColumn(name = "PARENTITEMID") } )
private Item parent;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private List<Item> children;
}
Run Code Online (Sandbox Code Playgroud)
有时,当我想带回与此项目表相关联的对象时,我会收到以下错误:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.webflow.engine.ActionExecutionException: Exception thrown executing [AnnotatedAction@6669ff5 targetAction = com.assisted.movein.web.common.nav.NavAction@6edf74b7, attributes = map['method' -> 'handleEntry']] in state 'oneTimeChargesAndFeesView' of flow 'in-flow' -- …Run Code Online (Sandbox Code Playgroud)