Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EE 7/EJB/JPA-实体管理器在持久化实体时不创建事务_Jpa_Transactions_Ejb_Entitymanager - Fatal编程技术网

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;
}