Java EE 7/EJB/JPA-实体管理器在持久化实体时不创建事务
我有一个客户端应用程序:Java EE 7/EJB/JPA-实体管理器在持久化实体时不创建事务,jpa,transactions,ejb,entitymanager,Jpa,Transactions,Ejb,Entitymanager,我有一个客户端应用程序: public static void main(String[] args) throws NamingException { Properties p = new Properties(); p.put(Context.PROVIDER_URL, "t3://127.0.0.1:7001"); p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactor
public static void main(String[] args) throws NamingException {
Properties p = new Properties();
p.put(Context.PROVIDER_URL, "t3://127.0.0.1:7001");
p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
InitialContext ctx = new InitialContext(p);
ServiceEJBStatelessRemote service = (ServiceEJBStatelessRemote)ctx.lookup("ServiceEJBStatelessJNDI#com.marcos.service.remote.ServiceEJBStatelessRemote");
User user = new User(123, "Foo BAR", "ertddeew45", "foousername");
Long id = service.insertUser(user);
System.out.println("User has been created with id: "+id);
每当我尝试在数据库中持久化这个实体时,我都不会得到异常,但不会存储在我的数据库中
在我的服务(无状态EJB)中,我有两个方法,一个用于插入,另一个用于检索;检索方法工作得很好,因此我可以看到Entity Manager属性工作,我的持久性单元以及我可以转到DB并检索我要查找的值
但是当我调用insertUser()方法时,我没有得到任何错误,但是实体没有保存在数据库中,就像根本没有提交操作一样
- 我正在Weblogic 12c服务器中部署我的应用程序
- 为了运行我的客户端应用程序,我将wlthint3client.jar添加到我的构建路径中
- 在我的insertUser()方法中,我不能调用getTransaction(),因为这样我会得到一个exeception
@Stateless(mappedName = "ServiceEJBStatelessJNDI", name="ServiceEJBStateless")
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ServiceEJBStateless implements ServiceEJBStatelessRemote {
@PersistenceContext(unitName="Test2Jpa2")
EntityManager em;
public ServiceEJBStateless() {
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public long insertUser(User user) {
em.persist(user);
em.merge(user);
return user.getUserId();
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public User findUser(long id) {
return em.find(User.class, id);
}
这是我的persistence.xml
<persistence-unit name="Test2Jpa2" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.marcos.domain.User</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
<property name="javax.persistence.jdbc.user" value="hibernatetest"/>
<property name="javax.persistence.jdbc.password" value="pwd123"/>
</properties>
</persistence-unit>
您正在使用
EJB容器管理事务
?您的交易类型是RESOURCE\u LOCAL
。尝试使用transaction type=“JTA”
更多-所使用的JDBC连接不是容器事务的一部分。你需要重新定义你的持久化单元:@CycDemo,我的事务类型是RESOURCE_LOCAL,但根据Chris的建议,我已经将其更改为JTA。嗨@Chris,我已经将我的事务类型更改为JTA,并且还创建了datasource.xml,从那方面看似乎还可以,但现在我得到了以下异常:线程“main”中的异常ejb.EJBException:反序列化错误响应时出现问题;嵌套异常为:java.io.InvalidClassException:org.eclipse.persistence.exceptions.ValidationException;本地类不兼容:stream classdesc serialVersionUID=8323218586942907354,本地类serialVersionUID=3793659634176227230
正如在我的用户类中所示,我已经声明了SV UID,我还将其更改为异常中显示的数字
@Entity
@Table(name="USERS")
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="USER_ID")
private long userId;
private String fullname;
private String password;
private String username;
public User() {
}
public User(String fm, String pwd, String username) {
this.fullname = fm;
this.password = pwd;
this.username = username;
}
public User(long id, String fm, String pwd, String username) {
this.userId = id;
this.fullname = fm;
this.password = pwd;
this.username = username;
}
public long getUserId() {
return this.userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
public String getFullname() {
return this.fullname;
}
public void setFullname(String fullname) {
this.fullname = fullname;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString(){
return "Id: "+this.userId+"\n"+
"Name: "+this.fullname+"\n"+
"Username: "+this.username+"\n"+
"Password: "+this.password;
}