标签: jpa

JPA EntityManager:为什么在merge()上使用persist()?

EntityManager.merge() 可以插入新对象并更新现有对象.

为什么要使用persist()(只能创建新对象)?

merge jpa entitymanager persist java-persistence-api

925
推荐指数
12
解决办法
58万
查看次数

JPA和Hibernate有什么区别?

我知道JPA 2是一个规范,Hibernate是ORM的工具.另外,我知道Hibernate比JPA 2有更多的功能.但从实际的角度来看,真正的区别是什么?

我有使用iBatis的经验,现在我正在尝试学习Hibernate或JPA2.我选了Pro JPA2书,它一直指的是"JPA提供者".例如:

如果您认为某个功能应该标准化,那么您应该说出来并向您的JPA提供商索取

这让我很困惑,所以我有几个问题:

  • 单独使用JPA2可以通过简单地注释我的POJO来从DB中获取数据
  • JPA2是否应该与"JPA Provider"一起使用,例如TopLink或Hibernate?如果是这样,那么使用JPA2 + Hibernate与单独使用JPA2相比有什么好处,或者与单独的Hibernate相比?
  • 你能推荐一本好的实用JPA2书吗?"Pro JPA2"似乎更像是JPA2上的圣经和参考(直到本书的后半部分才进入查询).有没有一本书对JPA2采取问题/解决方案?

java orm hibernate jpa java-ee

681
推荐指数
10
解决办法
49万
查看次数

Spring Data JPA中的CrudRepository和JpaRepository接口有什么区别?

Spring Data JPA CrudRepositoryJpaRepository接口有什么区别?

当我在网上看到这些例子时,我看到它们在那里可以互换使用.他们之间有什么区别?你为什么要用一个而不是另一个?

java spring jpa spring-data spring-data-jpa

603
推荐指数
8
解决办法
22万
查看次数

Java Persistence API中FetchType LAZY和EAGER之间的区别?

我是Java Persistence API和Hibernate的新手.

Java Persistence API FetchType.LAZY和之间的区别是什么FetchType.EAGER

java orm hibernate jpa java-persistence-api

512
推荐指数
12
解决办法
44万
查看次数

使用JPA @OneToMany关联时@JoinColumn和mappedBy之间有什么区别

有什么区别:

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
    @JoinColumn(name = "companyIdRef", referencedColumnName = "companyId")
    private List<Branch> branches;
    ...
}
Run Code Online (Sandbox Code Playgroud)

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, mappedBy = "companyIdRef")
    private List<Branch> branches;
    ...
}
Run Code Online (Sandbox Code Playgroud)

java orm hibernate jpa one-to-many

483
推荐指数
7
解决办法
46万
查看次数

Hibernate无法同时获取多个行李

Hibernate在SessionFactory创建期间抛出此异常:

org.hibernate.loader.MultipleBagFetchException:无法同时获取多个行李

这是我的测试用例:

Parent.java

@Entity
public Parent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 // @IndexColumn(name="INDEX_COL") if I had this the problem solve but I retrieve more children than I have, one child is null.
 private List<Child> children;

}
Run Code Online (Sandbox Code Playgroud)

Child.java

@Entity
public Child {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @ManyToOne
 private Parent parent;

}
Run Code Online (Sandbox Code Playgroud)

这个问题怎么样?我能做什么?


编辑

好吧,我遇到的问题是另一个"父"实体在我父母的内部,我的真实行为是这样的:

Parent.java

@Entity
public Parent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @ManyToOne
 private AntoherParent anotherParent;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 private List<Child> children;

}
Run Code Online (Sandbox Code Playgroud)

AnotherParent.java

@Entity …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa

428
推荐指数
8
解决办法
29万
查看次数

创建完美的JPA实体

我一直在使用JPA(实现Hibernate)一段时间,每次我需要创建实体时,我发现自己正在努力解决AccessType,immutable属性,equals/hashCode等问题.
因此,我决定尝试找出每个问题的一般最佳实践,并将其写下来供个人使用.
但是我不介意任何人对此发表评论或告诉我哪里错了.

实体类

  • 实现Serializable

    原因:规范说你必须这样做,但是有些JPA提供商并没有强制执行.Hibernate作为JPA提供程序并不强制执行此操作,但如果未实现Serializable,它可能会因为ClassCastException而陷入困境.

构造函数

  • 创建一个包含实体所有必填字段的构造函数

    原因:构造函数应始终将创建的实例保持在合理的状态.

  • 除了这个构造函数:有一个包私有默认构造函数

    原因:默认构造函数需要让Hibernate初始化实体; 允许private,但是在没有字节码检测的情况下,运行时代理生成和高效数据检索需要包私有(或公共)可见性.

字段/属性

  • 一般情况下使用字段访问,需要时使用属性访问

    原因:这可能是最有争议的问题,因为对于其中一个(属性访问与字段访问)没有明确和令人信服的论据; 然而,由于更清晰的代码,更好的封装以及不需要为不可变字段创建setter,因此字段访问似乎是最受欢迎的

  • 省略不可变字段的setter(访问类型字段不需要)

  • 属性可能是私有的
    原因:我曾经听说受保护对于(Hibernate)性能更好,但我可以在网上找到的是:Hibernate可以直接访问公共,私有和受保护的访问器方法,以及公共,私有和受保护的字段.选择取决于您,您可以匹配它以适合您的应用程序设计.

等于/的hashCode

  • 如果仅在持久化实体时设置此ID,则永远不要使用生成的id
  • 优先级:使用不可变值来形成唯一的Business Key,并使用它来测试相等性
  • 如果唯一的业务密钥不可用,则使用在初始化实体时创建的非瞬态UUID ; 有关更多信息,请参阅此精彩文章.
  • 从不参考相关实体(ManyToOne); 如果此实体(如父实体)需要成为业务密钥的一部分,则仅比较ID.只要您使用属性访问类型,在代理上调用getId()将不会触发实体的加载.

示例实体

@Entity
@Table(name = "ROOM")
public class Room implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "room_id")
    private Integer id;

    @Column(name = "number") 
    private String number; //immutable

    @Column(name = "capacity")
    private Integer capacity;

    @ManyToOne(fetch = FetchType.LAZY, optional = …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa equals

410
推荐指数
4
解决办法
15万
查看次数

JPA hashCode()/ equals()两难

这里有一些 关于JPA实体的讨论,以及哪些hashCode()/ equals()实现应该用于JPA实体类.大多数(如果不是全部)它们依赖于Hibernate,但我想讨论它们JPA实现中性(顺便说一下,我使用的是EclipseLink).

所有可能的实现都有各自的优点缺点:

  • hashCode()/equals()合同一致性(不变性)为List/ Set操作
  • 是否可以检测到相同的对象(例如来自不同会话,来自延迟加载的数据结构的动态代理)
  • 实体是否在分离(或非持久)状态下正常运行

据我所知,有三种选择:

  1. 不要覆盖它们; 依靠Object.equals()Object.hashCode()
    • hashCode()/ equals()工作
    • 无法识别相同的对象,动态代理的问题
    • 分离实体没有问题
  2. 根据主键覆盖它们
    • hashCode()/ equals()坏了
    • 正确的身份(适用于所有管理实体)
    • 分离实体的问题
  3. 根据Business-Id(非主键字段;外键怎么办?)覆盖它们.
    • hashCode()/ equals()坏了
    • 正确的身份(适用于所有管理实体)
    • 分离实体没有问题

我的问题是:

  1. 我错过了一个选项和/或pro/con点吗?
  2. 您选择了什么选项?为什么?



更新1:

通过" hashCode()/ equals()被破坏",我的意思是连续hashCode()调用可能会返回不同的值,也就是(当正确实施)不在的感觉打破ObjectAPI文档,但是当试图从检索改变实体引起的问题Map, Set或其他基于哈希的Collection.因此,在某些情况下,JPA实现(至少EclipseLink)将无法正常工作. …

java identity hibernate jpa eclipselink

296
推荐指数
9
解决办法
8万
查看次数

为什么JPA有@Transient注释?

Java有transient关键字.为什么JPA @Transient不是简单地使用已经存在的java关键字?

java annotations jpa transient java-ee

269
推荐指数
7
解决办法
29万
查看次数

JPA在持久化期间忽略字段的最快方法?

我基本上正在寻找一个"@Ignore"类型的注释,我可以用它来阻止特定字段被持久化.怎么能实现这一目标?

java database hibernate jpa

254
推荐指数
7
解决办法
16万
查看次数