我当前的项目使用HSQLDB2.0和JPA2.0.
该方案是:我查询数据库得到的名单contactDetails中person.我contactInfo在UI处删除单个但不保存该数据(Cancel保存部分).
我再次执行相同的查询,现在结果列表比先前的结果小1,因为我在UI处删除了一个contactInfo.但contactInfo如果我交叉检查,那仍然可以在DB上找到.
但是如果我entityManager.clear()在查询开始之前包含,我每次都会得到正确的结果.
我不明白这种行为.有人能说清楚吗?
我正在使用spring MVC从客户端接收JSON并自动从中创建一个对象.问题是客户端不向服务器发送实体中的所有字段,但某些字段为空并覆盖调用userDao.persist(user)的现有值.例如,我有这个实体:
@Entity
public class User {
@Id @GeneratedValue
private int id;
private String username;
private String password;
private String email;
Run Code Online (Sandbox Code Playgroud)
但是用户从不向我发送密码,因此从JSON构建的对象的"密码"字段为空.我不希望密码字段被空值覆盖.有一种方法可以说"休眠",如果你发现一个空值忽略它并且不覆盖数据库中保存的值?".我无法相信这个看似简单的问题没有一个简单的解决方案.
我有一个使用Hibernate/JPA,Spring和Jersey的应用程序.在我的应用程序上下文中,我设置数据源,定义实体管理器工厂,使用该实体管理器工厂设置事务管理器,并使用事务注释注释各种服务方法,因此我还有tx:annotation-driven definition to wire在我的交易经理需要的地方.这个设置很好,我已经能够读写得很好.我想转到数据库设置,我有一个主机与多个从属(MySQL).因此,我希望所有使用transactional注释的方法都使用指向主数据库服务器的数据源,并使用所有其他方法来使用从服务器的连接池.
我尝试创建两个不同的数据源,两个不同的实体管理器工厂和两个不同的持久性单元 - 至少可以说是丑陋的.我尝试了一个MySQL代理,但是我们遇到了更多问题.连接池已在servlet容器中处理.我可以在Tomcat中实现读取事务并将其定向到正确的数据库服务器的东西,还是有办法让所有那些使用事务注释注释的方法使用特定的数据源?
Symfony2应用程序通常具有一组实体.Doctrine EntityManager通常用于获取和持久化这些实体.
实体在整个应用程序中的多个位置使用; 对于许多实体和每个实体,包装给定实体的处理以及在服务中提取/持久化是有意义的.
例如,对于一个User实体,可能有一个UserServicewith fetchUser($user_id)和persistUser(User $user)方法(或者只是fetch()和persist()方法,这只是一个例子.
应用程序最终可以获得许多面向实体的服务,用于获取和持久化实体.这些服务的接口类似,处理的实体类型不同.
应用程序可以包含许多面向实体的服务似乎是一种常见的情况.因此,命名和构建此类服务的问题是一个常见问题.
对于新的应用程序需要的,例如,一个基地的创建EntityService和孩子UserService,WidgetService和ProductService班感觉重复,如用这样的处理方面应该是一个解决问题的方法.
是否有将此类实体管理相关服务引入Symfony应用程序的最佳实践?
这感觉它应该是一个已经解决的问题,可能会有一个很好的设计模式.
是否有建议遵循的命名约定?
我在不同的应用程序中观察到,选择"UserManager"和"UserService"作为服务名称.是否有普遍的公约?
我的代码看起来像这样.
this.entityManager = AppFactory.instance().getEntityManagerFactory().createEntityManager();
this.hibernateSession = entityManager.unwrap(Session.class);
try{
//do some queries using both entityManager and hibernateSession
}finally{
this.entityManager.close();
}
Run Code Online (Sandbox Code Playgroud)
但我似乎在某个地方有连接泄漏.我想知道我是否应该关闭entityManager和hibernateSession.还有其他人在这种情况下工作过吗?
我正在开发一个JPA应用程序(使用hibernate),我正在使用AutoFlush功能.
默认情况下,每当我们处理任何实体的查询时,都会刷新完整的EntityManager.在大多数情况下这是可以的:我们希望JPA处理针对最新数据库的查询.
但是,我们还在DB中存储了一些功能参数.这与我们的核心业务模型完全分离,我们不希望选择我们刷新EM的参数:参数的获取可能在过程中发生得非常深,当我们知道它时我们就失去了冲洗EM的控制;好的.
实际上,这会导致一些DB约束异常:数据模型尚未一致(在进程的中间),并且选择参数会强制刷新此数据模型.
我正在考虑添加第二个entityManager,只是参数,但我发现它有点矫枉过正.
可以更轻松地解决吗?使用参数DAO上的隔离级别,以便在单独的事务中处理参数?
我当前正在努力删除一个涉及各种关系的实体(仅限@ManyToOne) - 但是,Hibernate不会删除任何内容 - 在调用之后em.remove一切都保持不变.
我有5个实体(E1 - E5),引用有E6问题的实体(),如下所示:
@Entity
public class EX {
@OneToMany(mappedBy = "eX", fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.REMOVE })
private Set<E6> e6s;
}
Run Code Online (Sandbox Code Playgroud)
E6本身有相反的@ManyToOne关系:
public class E6{
@ManyToOne(optional = false)
private E1 e1;
@ManyToOne(optional = false)
private E2 e2;
@ManyToOne(optional = false)
private E3 e3;
@ManyToOne(optional = false)
private E4 e4;
@ManyToOne(optional = false)
private E5 e5;
}
Run Code Online (Sandbox Code Playgroud)
(遗漏了ID,其他列等......)
每当我打电话时em.remove(instanceOfE6),根本没有任何反应 …
没有可用于当前线程的实际事务的EntityManager - 无法可靠地处理"持久"调用
当我使用JUnit进行测试时,persist方法有效,我看到我的对象已插入,但是当我通过Controller调用该方法时不起作用
这是我的项目:
applicationContext.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<!-- <bean id="notification" class="com.app.sqli.notification.NotificationTask" /> -->
<!-- <task:scheduled-tasks> -->
<!-- <task:scheduled ref="notification" method="notifier" cron="*/2 * * * * *"/> -->
<!-- </task:scheduled-tasks> -->
<context:component-scan base-package="com.app.sqli" />
<mvc:annotation-driven />
<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.app.sqli.entities" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
<prop …Run Code Online (Sandbox Code Playgroud) 最近我尝试了一点JPA,试图更多地理解整个框架.我使用Eclipselink作为JPA提供程序.
我有两个实体有一个@OneToMany关系(一个人有很多地址)是懒惰加载.
当我加载一个人实体,分离它然后尝试访问(未加载)地址...它作为一个魅力.在调试时,我可以看到在执行size()地址列表的方法时执行了数据库查询.
我不明白为什么会有效.我希望有某种例外.我在最后几天(即这个链接)已经阅读了很多关于jpa等的内容,但是所有内容都指出了我不应该工作的结论.
任何人都可以解释为什么有效吗?
@Stateless
public class Test {
@PersistenceContext(unitName="TestPU") EntityManager em;
public void test() {
Person person = em.find(Person.class, 1);
System.out.println(person);
System.out.println("em.contains(person): " + em.contains(person);
em.detach(person);
System.out.println("em.contains(person): " + em.contains(person);
person.getAddresses().size();
System.out.println("em.contains(person): " + em.contains(person);
System.out.println(person);
}
}
Run Code Online (Sandbox Code Playgroud)
结果日志将是
DEBUG: SELECT ... from PERSON WHERE (id = ?)
Person{id=1, name=Test, addresses={IndirectList: not instantiated}}
em.contains(person): true
em.contains(person): false
DEBUG: SELECT ... FROM ADDRESSES where (address_fk = ?)
em.contains(person): false
Person{id=1, name=Test, addresses={[Address{id=10, city=Testcity}]}}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个具有Web组件(通过浏览器访问)和后台任务处理组件的应用程序,Web组件将一些运行时间长的东西委托给该应用程序。
当我刷新Web浏览器时才发现它无限期加载(刚发现是AJAX,但后来出现在正常请求中),这只是一个问题。
它看起来似乎并不很明显,但是一旦我关闭了后台Symfony命令,该命令也利用EntityManager了浏览器,它就会被解除阻止并继续进行请求。
我的应用程序用于RabbitMQ存储由Web组件发布的作业请求。该Symfony命令使用相同的“主干”来创建RabbitMQ使用者并接受这些作业。
我试过了,没有任何结果:
ApacheRabbitMQRabbitMQ队列EntityManagers对Web和命令使用不同我使用OldSoundRabbitMqBundle(link)促进两者之间的通信。
无论调用什么操作,Web组件都会卡住(与RabbitMQ生产者无关)。
有人偶然发现类似问题吗?
这发生在开发箱上,我还没有在生产服务器上试用它,直到我找到更多有关此事的机会。
entitymanager ×10
jpa ×7
hibernate ×5
java ×2
symfony ×2
cascade ×1
detach ×1
doctrine-orm ×1
eclipselink ×1
flush ×1
hsqldb ×1
jpa-2.0 ×1
rabbitmq ×1
spring ×1
spring-mvc ×1
tomcat ×1
transactions ×1