我使用JPA Hibernate Spring进行简单的工作。我写了下一个模块:
服务:
@Autowired
private VolMng volMng;
@Service
public class Dist {
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void gen() {
MeterLog mLog = em.find(MeterLog.class, 3625190);
Lst volTp = lstMng.findByCD("Fact Vol");
Vol vol = new Vol((MeterLog) mLog, volTp, 7777.77d);
volMng.add(vol);
//point-1:
for (Vol a : mLog.getVol()) {
System.out.println("found="+a.getId()+" vol="+a.getVol1());
}
...
...
服务:
@Service
public class VolMngImpl implements VolMng {
@Autowired
private VolDAO vDao;
public void add(Vol vol) {
vDao.add(vol);
}
}
道:
@Repository
public class VolDAOImpl implements VolDAO {
@PersistenceContext
private EntityManager em;
public void add(Vol vol) {
em.persist(vol);
}
}
我正在尝试向子实体卷添加一些记录。
但是在沃姆格之后。在点1添加(vol)我没有看到任何添加的记录(子实体)。为什么?
upd
当然我会在交易结束后看到这些记录,但为什么我不能在交易结束前看到这些记录呢???它们必须在内存缓存中。。。
upd2
我的Spring。xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd">
<!-- *******************************
***** CACHE CONFIGURATION *****
******************************* -->
<cache:annotation-driven cache-manager="cacheManager" />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehcache"/>
</bean>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml"/>
<property name="shared" value="true"/>
</bean>
<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
<property name="URL" value="jdbc:oracle:thin:@192.168.1.1:1521:DEV" />
<property name="user" value="ora"/>
<property name="password" value="ora"/>
<property name="connectionCachingEnabled" value="true"/>
</bean>
<bean
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory">
<property name="dataSource" ref="dataSource" />
</bean>
<context:component-scan base-package="com.ric.bill" />
<context:component-scan base-package="com.ric.bill.dao.impl" />
<context:component-scan base-package="com.ric.bill.mm.impl" />
<bean class="org.springframework.orm.jpa.JpaTransactionManager"
id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven mode="proxy" transaction-manager="transactionManager"/>
<context:spring-configured />
<context:annotation-config />
</beans>
为了回答实际问题——为什么你看不到新添加的实体...
运行select语句并将结果放入java对象中:
MeterLog mLog=em.find(MeterLog.class,3625190)
查找最终创建选择语句,结果集通过Hibernate根据用于定义映射的jpa注释转换为MeterLog对象。从这一点上你的代码不会改变这个对象。使用以下代码创建一个新实体:
volMng.add(vol);
它直接将新实体保存在数据库中。但是,这是在select已返回您要求的数据之后。您不需要做任何更改或刷新已获取的结果集。底层数据存储(oracle、mysql等)不记得您已经查询过它并且保存了它的数据副本,因此它无法提醒您底层数据已经更改。
正如您在回答中提到的,您可以将新实体直接添加到对象的集合中:
mLog.getVol().add(vol);
在某些情况下,这将在事务成功完成时将新实体持久化到数据库中,但也允许您在循环收集时查看实体,从而观察到。然而,在这里这样做违反了德米特定律——创建给定MeterLog时,Vol应负责将其自身添加到卷集合中。
要解决此问题,我必须将子实体添加到父实体,如下所示:
MeterLog mLog = em.find(MeterLog.class, 3625190);
Lst volTp = lstMng.findByCD("Fact Vol");
Vol vol = new Vol((MeterLog) mLog, volTp, 7777.77d);
mLog.getVol().add(vol);
//point-1:
for (Vol a : mLog.getVol()) {
System.out.println("found="+a.getId()+" vol="+a.getVol1());
}
集合不会在会话中自动更新。一旦你重新加载所有内容,它就会出现,但是你必须手动将它添加到拥有对象的子集合中,以防你在当前会话中需要它。
我有一个用户名数组(例如,)要添加到图中的“user”标签下。 现在我首先要检查用户名是否已经存在(),然后仅在“user”标签下添加username属性不匹配的内容。 此外,这可以在单个gremlin查询或groovy脚本中完成吗? 我正在使用titan graph数据库、tinkerpop3和gremlin REST服务器。
我可能需要一些帮助,因为我被这些文件弄糊涂了: 我有一个JPA母公司: 和孩子: 如果我只是增加联系人,我希望JPA能够建立这种关系。 e、 g: 现在发生的是: 触点插入DB(良好) 使用providerX。联系人中的id。提供者列(良好) provider\u contact表中未显示任何关系条目 我知道我可以将联系人设置为提供者的属性<代码>providerX。联系人。添加(c)。。。回购。
问题内容: 我只想在文件末尾添加换行符,以防止在文件末尾出现多个换行符。 我希望使用sed。这是我当前代码遇到的问题: 当我在文件上运行代码时; 如果没有,它将添加换行符,如果存在则将其删除…这使我感到困惑。 问题答案: 由于它会删除换行符(如果不存在),因此您可以简单地使用: 添加换行符并删除所有内容,然后添加换行符。不是优雅的方式,但肯定可以工作:)
问题内容: 我正在使用构建Web POST参数的方法,但是有一些值仅在它们不存在的情况下才想添加。 效果很好,但是如果我将变量设为可选,如何防止将其添加到参数中?像这样的东西(伪代码): 我希望这已经足够清楚了,有人知道如何解决吗? 问题答案: 创建初始字母后,您必须单独添加密钥: Python没有语法将键定义为条件键;如果您已经按顺序拥有所有内容,则可以使用dict理解: 但这不是很可读。 另一
我对spring rest api有点陌生。我有两个具有单向多对一关系的实体。 假设我在城市表中已经有一些城市。当我想使用http post方法添加城市id为2的新用户时,我必须执行以下操作: 如您所见,我必须首先将城市ID分组到城市实体中。没有分组,我怎么做?这样地:
我遵循了以下关于如何为单个产品将ajax添加到购物车的指南:https://aceplugins.com/ajax-add-to-cart-button-on-the-product-page-woocommerce/ 我在我的孩子主题function.php文件中有PHP,它应该工作。 我的问题是,我只想使用时,一个简单的产品,只有这样,它是可用于其他产品类型。 我尝试将其添加到函数中,如下所示