Tag: jpa

Spring + JPA:不从数据库中获取对象

我正在实施一个在线商店。 我有以下代码来保存订单: @Service @Transactional public class OrderServiceImpl extends GenericServiceImpl implements OrderService { @Inject private ItemRepository itemRepository; @Override public void saveOrder(Order order) { this.updateItemsAccordingToOrderedQuantities(order); repository.save(order); } private void updateItemsAccordingToOrderedQuantities(Order order) { List orderedItems = order.getOrderedItems(); for (OrderedItem orderedItem : orderedItems) { // fetch from database Item item = itemRepository.findOne(orderedItem.getItem().getId()); item.reduceWeightInColdStoreBy(orderedItem.getWeight()); itemRepository.update(item); } } } 在实际保存订单之前,我更新了每个商品的“重量”属性(一些数量与此订单一起销售,因此剩下的更少)。 OrderedItem对象保存对Item的引用,但我想从数据库中获取新的Item […]

在Hibernate中保护实体免于级联删除

简单的问题:有没有人有任何想法如何保护某些实体在运行时在hibernate 中通过CascadeType.ALL删除(可能会抛出运行时exception)? 说,我们有一些实体: @Entity @Table(name = “FOO_ENTITY”) public class FooEntity { … } 我想保护它免受意外的错误映射,例如: @Entity @Table(name = “SOME_OTHER_FOO_ENTITY”) public class SomeOtherFooEntity { … @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = “FOO_ENTITY_ID”) private FooEntity fooEntity; } 因此,应该可以通过session.delete(fooEntityObj)删除某个类型为FooEntity实体,但必须禁用它才能通过级联删除删除它( session.delete(someOtherFooEntityObj) )。 注意 :对于那些读我的问题不专心或认为我不明白我在问什么的人: 1)我无法删除 CascadeType.ALL 。 问题是:谁编程避免和保护这个? 2)unit testing不是方法,我正在寻找运行时解决方案。

EJB / JPA:如何使用EntityManager.persist()始终插入新记录,而不是更新

EntityManager.persist()函数正在尝试更新现有记录,但我总是需要插入一个新记录。 怎么做到这一点? 实体bean的一部分: @Entity @Table(name=”SYNC_TRIGGER”, schema=”ETL”) public class SyncTrigger implements Serializable { @Id @Column(name=”ID”) @SequenceGenerator(name = “TRIGGER_SEQ”, sequenceName = “ETL.TRIGGER_SEQ”) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “TRIGGER_SEQ”) private Long triggerId; …… 无状态bean的一部分,它保留了记录: @Stateless public class TriggerPersister { @PersistenceContext(unitName=”syncTriggerDS”) protected EntityManager entityManager; public void persistTrigger(SyncTrigger st, T concreteTrigger){ entityManager.persist(st); ……… UPD:在执行entityManager.persist(st)之前st.triggerId值为null,但是之后添加的记录的id-id被分配给该字段。

使用JPA删除实体的问题

UPDATE 我的朋友做了相同的代码行,他的行很正常。 会是什么呢? 我使用NetBeans 7.0.1,他的是6.9.1。 我的GlassFish是3.1,他是3.0.1 更新结束 @Inheritance(strategy= InheritanceType.JOINED) @Entity @Table(name = “vehicle”) @DiscriminatorColumn(name = “type”, discriminatorType = DiscriminatorType.INTEGER) @NamedQueries({ @NamedQuery(name = “Vehicle.findAll”, query = “SELECT v FROM Vehicle v”)}) public class Vehicle implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = “id”) private Integer id; @JoinColumn(name = […]

春季默认@Transactional和默认的丢失更新

在spring的环境中有一个大的现象,或者我非常错误。 但默认的spring @Transactional注释不是ACID,只有ACD缺乏隔离。 这意味着如果你有方法: @Transactional public TheEntity updateEntity(TheEntity ent){ TheEntity storedEntity = loadEntity(ent.getId()); storedEntity.setData(ent.getData); return saveEntity(storedEntity); } 如果2个线程以不同的计划更新进入,会发生什么。 它们都从db加载实体,它们都应用自己的更改,然后第一个被保存并提交,第二个被保存并提交第一个UPDATE IS LOST。 那是真的吗? 使用调试器它就是这样工作的。

如何在JPA中反映“嵌套集”模型

最好将嵌套集用于分层数据。 但在此设计中,如果删除或插入一些数据,则应始终计算右侧和左侧节点。 此外,您没有任何外键。 我如何用JPA反映这个模型? 可能吗?

传播.REQUIRES_NEW似乎不起作用

使用Spring(MVC,Batch和persistence)我定义了以下接口: public interface JobStatusService { @Transactional(readOnly = false) @Modifying JobStatus save(JobStatus status); @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) Optional get(ResultsIdentifier identifier); } 请注意REQUIRES_NEW因为它是在破碎的方法上。 该接口实现于: @Override public JobStatus save(JobStatus status) { if (status.getUserId() == null) { status.setUserId(userService.getCurrentUser()); } status.setLastUpdateTime(new Date()); return repository.save(status); } @Override public Optional get(ResultsIdentifier identifier) { return repository.findByJobIdentifier(identifier); } 其中repository是JPA存储库,其中包含以下内容: public interface JobStatusRepository […]

使用外键字段持久化实体时出错

我试着坚持数据库这个实体: @Entity @Table(name=”pessoa_juridica”) public class PessoaJuridica { @Id @Column(name = “id”) @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; @Column(name=”cnpj”) @Order(value=1) private String cnpj; @Column(name=”razao_social”) @Order(value=2) private String razaoSocial; @OneToOne( fetch = FetchType.EAGER, cascade = {CascadeType.ALL} ) @Order(value=3) @JoinColumn(name=”contato”) private Contato contato; } 但是当我用表单打开视图时,我收到此错误: org.springframework.beans.NullValueInNestedPathException: Invalid property ‘pessoaJuridica.contato’ of bean class [com.spring.loja.model.cliente.persistence.model.Cliente]: Could not instantiate property type [java.lang.Integer] to […]

Group By:Spring JPA规格

我正在尝试使用Spring Data JPA规范,并想知道如何在规范中使用Group By 。 请参阅下面我当前的规格: 知识库 public interface OauthAccessTokenRepository extends JpaRepository, JpaSpecificationExecutor { } 规格 public class OauthAccessTokenSpecification { public static Specification equalsTokenId(final String tokenId) { return new Specification() { public Predicate toPredicate(Root root,CriteriaQuery query, CriteriaBuilder cb) { return cb.equal(root.get(“tokenId”), tokenId); } }; } public static Specification equalsRefreshToken(final String refreshToken) { return new Specification() […]

JPA / Hibernate:具有多个持久性单元的模式生成

我有一个应用程序,它使用一组位于2个不同数据库中的JPA实体。 我用多个持久性单元配置它。 问题是我想使用模式生成自动生成模式,并且在两个数据库中都创建了所有实体。 我有两种PU: 而且,是的,我想使用元数据自动获取实体。 我不想提供手动脚本,因为我需要让它与实体保持同步。 有没有办法标记哪个实体由哪个PU生成? -edit:请注意,在@Table上添加“schema”属性并不能解决问题,因为每个PU都会尝试在正确的模式中创建相同的实体,并且会因为表已经存在而出现错误。