EntityManager.merge()
可以插入新对象并更新现有对象.
为什么要使用persist()
(只能创建新对象)?
我知道JPA 2是一个规范,Hibernate是ORM的工具.另外,我知道Hibernate比JPA 2有更多的功能.但从实际的角度来看,真正的区别是什么?
我有使用iBatis的经验,现在我正在尝试学习Hibernate或JPA2.我选了Pro JPA2书,它一直指的是"JPA提供者".例如:
如果您认为某个功能应该标准化,那么您应该说出来并向您的JPA提供商索取
这让我很困惑,所以我有几个问题:
Spring Data JPA CrudRepository
和JpaRepository
接口有什么区别?
当我在网上看到这些例子时,我看到它们在那里可以互换使用.他们之间有什么区别?你为什么要用一个而不是另一个?
我是Java Persistence API和Hibernate的新手.
Java Persistence API FetchType.LAZY
和之间的区别是什么FetchType.EAGER
?
有什么区别:
@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) 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) 我一直在使用JPA(实现Hibernate)一段时间,每次我需要创建实体时,我发现自己正在努力解决AccessType,immutable属性,equals/hashCode等问题.
因此,我决定尝试找出每个问题的一般最佳实践,并将其写下来供个人使用.
但是我不介意任何人对此发表评论或告诉我哪里错了.
实现Serializable
原因:规范说你必须这样做,但是有些JPA提供商并没有强制执行.Hibernate作为JPA提供程序并不强制执行此操作,但如果未实现Serializable,它可能会因为ClassCastException而陷入困境.
创建一个包含实体所有必填字段的构造函数
原因:构造函数应始终将创建的实例保持在合理的状态.
除了这个构造函数:有一个包私有默认构造函数
原因:默认构造函数需要让Hibernate初始化实体; 允许private,但是在没有字节码检测的情况下,运行时代理生成和高效数据检索需要包私有(或公共)可见性.
一般情况下使用字段访问,需要时使用属性访问
原因:这可能是最有争议的问题,因为对于其中一个(属性访问与字段访问)没有明确和令人信服的论据; 然而,由于更清晰的代码,更好的封装以及不需要为不可变字段创建setter,因此字段访问似乎是最受欢迎的
省略不可变字段的setter(访问类型字段不需要)
@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) 这里有一些 关于JPA实体的讨论,以及哪些hashCode()
/ equals()
实现应该用于JPA实体类.大多数(如果不是全部)它们依赖于Hibernate,但我想讨论它们JPA实现中性(顺便说一下,我使用的是EclipseLink).
所有可能的实现都有各自的优点和缺点:
hashCode()
/equals()
合同一致性(不变性)为List
/ Set
操作据我所知,有三种选择:
Object.equals()
和Object.hashCode()
hashCode()
/ equals()
工作hashCode()
/ equals()
坏了hashCode()
/ equals()
坏了我的问题是:
更新1:
通过" hashCode()
/ equals()
被破坏",我的意思是连续hashCode()
调用可能会返回不同的值,也就是(当正确实施)不在的感觉打破Object
API文档,但是当试图从检索改变实体引起的问题Map
, Set
或其他基于哈希的Collection
.因此,在某些情况下,JPA实现(至少EclipseLink)将无法正常工作. …
Java有transient
关键字.为什么JPA @Transient
不是简单地使用已经存在的java关键字?
我基本上正在寻找一个"@Ignore"类型的注释,我可以用它来阻止特定字段被持久化.怎么能实现这一目标?
jpa ×10
java ×9
hibernate ×7
orm ×3
java-ee ×2
annotations ×1
database ×1
eclipselink ×1
equals ×1
identity ×1
merge ×1
one-to-many ×1
persist ×1
spring ×1
spring-data ×1
transient ×1