我遇到了一个没有初始化的Hibernate实体的问题.
它似乎还在返回一个未初始化的代理...
如果我查看我的调试信息,我希望我的实体初始化.
但它看起来如下:
entity = {SomeEntity_$$_jvst47c_1e@9192}"SomeEntityImpl@1f3d4adb[id=1,version=0]"
handler = {org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer@9196}
interfaces = {java.lang.Class[2]@9197}
constructed = true
persistentClass = {java.lang.Class@3605}"class SomeEntityImpl"
getIdentifierMethod = null
setIdentifierMethod = null
overridesEquals = true
componentIdType = null
replacement = null
entityName = {java.lang.String@9198}"SomeEntityImpl"
id = {java.lang.Long@9199}"1"
target = {SomeEntityImpl@9200}"SomeEntityImpl@1f3d4adb[guid=<null>,id=1,version=0]"
initialized = true
readOnly = true
unwrap = false
session = {org.hibernate.internal.SessionImpl@6878}"SessionImpl(PersistenceContext[entityKeys=[EntityKey[EntityReferenceImpl#2], EntityKey[SomeEntityImpl#1], EntityKey[...
readOnlyBeforeAttachedToSession = null
sessionFactoryUuid = null
allowLoadOutsideTransaction = false
Run Code Online (Sandbox Code Playgroud)
请注意,我的Hibernate POJO handler在进行显式初始化后仍然只包含一个偶数...
在我的调试视图中,当我展开target节点时,我可以看到'真实'属性值(上面没有显示).
我在做什么:
EntityReferenceImpl entityReference = findEntityReference(session);
SomeEntity …Run Code Online (Sandbox Code Playgroud) 在我参与的一个DDD项目中,我们正在寻找一些方便的解决方案来映射entity objects,domain objects反之亦然。
该项目的开发人员同意将领域模型与数据模型完全解耦。数据层使用JPA (Hibernate)持久化技术。
正如我们都认为持久性是 DDD 中的一个实现细节,从开发人员的角度来看,我们都在应用程序的各个方面寻找最合适的解决方案。
我们最关心的是aggregate,包含 列表的何时entities映射到JPA entity包含one-to-many关系的 。
看一下下面的例子:
public class Product extends Aggregate {
private ProductId productId;
private Set<ProductBacklogItem> backlogItems;
// constructor & methods omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
public class ProductBacklogItem extends DomainEntity {
private BacklogItemId backlogItemId;
private int ordering;
private ProductId productId;
// constructor & methods omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
public class ProductJpaEntity { …Run Code Online (Sandbox Code Playgroud) 在工作中,我们正在开发一个RESTful应用程序,其中数据层将由Hibernate处理.但我们不确定如何处理实体更新.
我们计划做以下事情:
1)客户端通过id请求实体
2)Hibernate加载实体,请求的字段(总是带有版本)被复制到转换为JSON并发送到客户端的DTO
3)客户端管理一些字段并发送实体(与版本号)回到服务器.
4)服务器接收转换为DTO的JSON.
5)从Hibernate加载相应的实体,并将DTO的道具复制到实体.
=>即使设置了客户端的版本号,也始终会覆盖实体.这是否意味着我们总是必须自己检查客户端的版本号与已加载实例的版本号,而不是Hibernate这样做?
在具有会话的常规应用程序中,分离的实例保存在HttpSession中.每当客户端更新实体时,都会从HttpSession中检索实例,并更新一些属性.每当Hibernate提交更新时,如果版本号是<当前版本号,则抛出ObjectStaleException.
这里的问题是我们没有任何Http会话,因为我们试图成为RESTful.
是否有一个通用的解决方案来处理RESTful应用程序中的乐观锁定,而不是自己检查版本号?
我遇到一个问题,即在Validation实例上将一个Step实例添加到Collection .声明如下:
步骤类:
@Entity
@Table
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Step extends AbstractEntity implements ValidatableStep {
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "step_id", nullable = false)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set<Validation> validations = new HashSet<>();
@Override
public void addValidation(Validation validation) {
// do some stuff
...
// add validation instance to collection
getValidations().add(validation);
}
}
Run Code Online (Sandbox Code Playgroud)
验证类:
@Entity
@Table
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Validation extends AbstractEntity …Run Code Online (Sandbox Code Playgroud) 我们使用EhCache的2级高速缓存(4.3.8.Final中)Hibernate(4.3.8.Final)用于查询(仅在主要读取表),实体之间的实体与集合。
所以你可以说二级缓存被大量用于优化目的。
到目前为止,我们从未遇到过任何大问题......
我们关于相关实体的持久性模型基本上如下所示:
首先,我们有 2 个实体,它们在自然父子关系中具有双向映射:
@Entity
@Table(...)
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Parent extends BaseEntity {
@Id
private long id;
@OneToMany(mappedBy="parent", fetch=FetchType.LAZY, cascade = CascadeType.REMOVE)
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
private Set<Child> children;
// getters and setters
}
@Entity
@Table(...)
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Child extends BaseEntity {
@Id
private long id;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "parent_id", nullable = false)
private Parent parent;
// getters and setters …Run Code Online (Sandbox Code Playgroud)我们的(Spring)应用程序包含几个Schedulers在夜间变为活动状态以更改/更新某些数据(来自Database)的应用程序Batch.
这一切都运行正常,问题是我们的应用程序很快就会运行了clustered environment.
什么是防止最好的选择scheduler的instance A,并instance B在同一时间做同样的工作?
**更新**
集群环境设置为'active-active'.
每个节点都与它自己的数据库实例进行通信.每个数据库实例都将replicate数据发送到其他实例.
数据库实例未设置为,'master-slave'但将Galera cluster在每个实例执行insert-update-delete操作的位置运行.
所以每个scheduler应该只在一个实例上运行一次.其他实例不应运行调度程序.所以我需要找到一个实例的调度程序运行的方法,其他实例的相同调度程序不应该运行.
在工作中,我们目前正在构建一个支持的网络应用SSE。
我们都是相对较新的人SSE,因此我们要处理很多(新手)问题:
当客户端关闭浏览器时,我们最终会断开连接。我认为有些人称其为鬼连接。
我们如何在服务器端检测到此类连接?我们要从通知列表中删除这些客户端。
我知道每个' SSE-connection'都活着application server。当我关闭开发服务器时,我直接在浏览器调试器上注意到连接消失了。
我们不应该设置一些连接上限吗? The application server连接将耗尽一些时间...
此外,某些服务器为每个请求专用一个线程。这样可能导致线程耗尽的问题...
应该SSE-broadcasting由一个application server(大多数请求与业务相关)来管理整个事务,还是应该由一个web server专门用于处理事务的事务来管理整个事务SSE-event?目前,所有业务请求和SSE事件均由处理Jboss application server。
如何在主动/主动模式(= master-master)中在实例之间随机路由请求的群集环境中管理SSE?
如果您有更多有用的信息(以及需要注意的注意事项),请随时分享!
我遇到的情况是,每条新记录都应包含唯一且可读的值。该值对用户具有业务意义,并将在我们的数据库中作为自然ID(主键旁边)进行处理。
让您大致了解价值的结构:
- record 1 has business value 'INVOICE_AAA_001'
- record 2 has business value 'INVOICE_AAA_002'
...
- record 999 has business value 'INVOICE_AAA_999'
- record 1000 has business value 'INVOICE_BAA_001'
- record 1001 has business value 'INVOICE_BAA_002'
...
Run Code Online (Sandbox Code Playgroud)
此业务价值是由工厂创造的:
class BusinessFactory {
...
public String createUniqueValue() {
String lastValue = (String) getSession().createQuery("select businessValue " +
"from Invoice as invoice " +
"order by businessValue")
.setMaxResults(1)
.setReadOnly(true)
.uniqueResult();
// generate new value
return newValue;
}
}
Run Code Online (Sandbox Code Playgroud)
服务层将致电工厂并保存新的发票:
@Transactional
public void …Run Code Online (Sandbox Code Playgroud) 目前,我们正在迁移写的遗留应用程序Spring/Hibernate,以Spring Boot(对于具有更简洁的配置及其他福利).
因为Spring Boot坚持JPA,我们必须"迁移"我们的遗留代码 - 用native Hibernate(第5版)编写- 来JPA.
我们现在面临的问题FlushMode是,即使定义了Hibernate,也不会在触发查询之前刷新会话AUTO
配置如下:
1)主Spring Boot Config是应用程序的入口
@Configuration
@EnableAutoConfiguration
@ComponentScan
@Slf4j(topic = "system")
public class MainApp {
public static void main(String[] args) {
SpringApplication.run(MainApp.class, args);
}
Run Code Online (Sandbox Code Playgroud)
2)持久性配置:
- 创建JPA Transaction Manager;
- 创建一个HibernateJpaSessionFactoryBean以防止我们不必调整SessionFactory使用(和自动装配)的所有地方EntityManagerFactory并确保SessionFactory并且EntityManagerFactory都参与相同(JPA)Transaction.
@Configuration
public class PersistenceConfig {
@Bean
public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
JpaTransactionManager …Run Code Online (Sandbox Code Playgroud) 我们正在 Spring MVC 中构建一个新应用程序,并使用 Hibernate 作为持久性解决方案。有两种处理数据层的解决方案:
1) 在某些情况下控制器直接调用DAO层。这样做是因为不需要执行业务检查。因此,对于这种情况,我们会绕过服务层。为此实现服务层只需将方法委托给 DAO 层即可。
所以我们正在执行以下操作:Controller -> DAO
2)在其他情况下,我们确实需要一些业务检查。为此,我们采用常规方式:
Controller -> Service -> DAO
在Spring中我们需要划分一个Transaction,因此我们在所有DAO方法上都添加了@Transaction注解。这在 Controller -> DAO 方式下工作得很好。但如果我们采用的是Controller -> Service -> DAO 方式,我们还需要在服务方法上添加@Transaction 注解。
这意味着在某些情况下我们会存在嵌套事务。这是一个好方法吗?我们是否需要在所有 DAO 方法上创建一个新事务 (REQUIRES_NEW),还是使用现有事务 (REQUIRED)(如果存在)?
有人可以启发我吗?
model-view-controller hibernate spring-mvc spring-transactions