这里有一些 关于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()调用可能会返回不同的值,也就是(当正确实施)不在的感觉打破ObjectAPI文档,但是当试图从检索改变实体引起的问题Map,   Set或其他基于哈希的Collection.因此,在某些情况下,JPA实现(至少EclipseLink)将无法正常工作. …
如果某个字段有注释insertable=false, updatable=false,这是否意味着您不能插入值也不能更改现有值?你为什么想这么做?
@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @OneToMany(mappedBy="person", cascade=CascadeType.ALL)
    private List<Address> addresses;
}
@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @ManyToOne
    @JoinColumn(name="ADDRESS_FK")
    @Column(insertable=false, updatable=false)
    private Person person;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用like子句编写JPQL查询:
LIKE '%:code%'
Run Code Online (Sandbox Code Playgroud)
我想有代码= 4并找到
455 554 646 ...
我无法通过 :code = '%value%'
namedQuery.setParameter("%" + this.value + "%");
Run Code Online (Sandbox Code Playgroud)
因为在另一个地方我不需要:value被%chars 包裹.有帮助吗?
在JPA中有一个名为的属性referencedColumnName,可以设置@JoinColumn, @PrimaryKeyJoinColumn这个设置背后的想法,有人可以举出一个很好的例子来说明这个可以使用的地方吗?
当我们使用Hibernate配置数据源时,我们应该添加hibernate.dialect属性(或者eclipselink.target-database如果您使用的是EclipseLink).
我想知道方言的含义是什么?我根据Hibernate的文档配置了这个属性,但我不知道它的含义是什么.
我一直在JPA 1.0(Hibernate驱动程序)中使用Hibernate Restrictions.定义了Restrictions.ilike("column","keyword", MatchMode.ANYWHERE)哪些测试关键字是否匹配列的任何位置,并且它不区分大小写.
现在,我使用JPA 2.0和EclipseLink作为驱动程序,因此我必须使用"Restrictions"内置JPA 2.0.我发现CriteriaBuilder和方法like,我也发现了如何使它匹配任何地方(尽管它是令人讨厌和手动),但我仍然没有想出如何做它不区分大小写.
我目前有一个很好的解决方案:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
EntityType<User> type = em.getMetamodel().entity(User.class);
Root<User> root = query.from(User.class);
// Where   
// important passage of code for question  
query.where(builder.or(builder.like(root.get(type.getDeclaredSingularAttribute("username", String.class)), "%" + keyword + "%"),
        builder.like(root.get(type.getDeclaredSingularAttribute("firstname", String.class)), "%" + keyword + "%"),
        builder.like(root.get(type.getDeclaredSingularAttribute("lastname", String.class)), "%" + keyword + "%")
        ));
// Order By
query.orderBy(builder.asc(root.get("lastname")),
            builder.asc(root.get("firstname")));
// Execute
return em.createQuery(query).
            setMaxResults(PAGE_SIZE + 1).
            setFirstResult((page - 1) * PAGE_SIZE).
            getResultList();
Run Code Online (Sandbox Code Playgroud)
问题: …
我想使用JPA(eclipselink)从我的数据库中获取数据.数据库由许多其他来源更改,因此我想回到我执行的每个查找的数据库.我已经阅读了许多关于禁用缓存的帖子,但这似乎没有用.有任何想法吗?
我正在尝试执行以下代码:
        EntityManagerFactory entityManagerFactory =  Persistence.createEntityManagerFactory("default");
        EntityManager em = entityManagerFactory.createEntityManager();
        MyLocation one = em.createNamedQuery("MyLocation.findMyLoc").getResultList().get(0);
        MyLocation two = em.createNamedQuery("MyLocation.findMyLoc").getResultList().get(0);    
        System.out.println(one==two);
Run Code Online (Sandbox Code Playgroud)
一个==两个是真的,而我希望它是假的.
我尝试将以下每个/所有内容添加到我的persistence.xml中
<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.cache.size.default" value="0"/>
<property name="eclipselink.cache.type.default" value="None"/>
Run Code Online (Sandbox Code Playgroud)
我也尝试将@Cache注释添加到实体本身:
@Cache(
  type=CacheType.NONE, // Cache nothing
  expiry=0,
  alwaysRefresh=true
)
Run Code Online (Sandbox Code Playgroud)
我误会了什么吗?
更新数据库时我应该更喜欢什么?两种方法的优缺点是什么?何时使用其中一种方法?
public void disemployEmployee(Integer employeeId, Date endDate) {
    Employee employee = (Employee)em.find("Employee", employeeId);
    employee.getPeriod().setEndDate(endDate);
    em.flush();
}
public void disemployEmployee(Integer employeeId, Date endDate) {
    Employee employee = (Employee)em.find("Employee", employeeId);
    em.getTransaction().begin();
    employee.getPeriod().setEndDate(endDate);
    em.getTransaction().commit();
}
Run Code Online (Sandbox Code Playgroud) 运行由maven构建的具有以下依赖项的项目时:
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.7.0</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)
我在运行时收到以下错误:
java.lang.SecurityException: class "javax.persistence.Cacheable"'s signer information does not match signer information of other classes in the same package
Run Code Online (Sandbox Code Playgroud)
javax.persistence-2.2.0工件已签名并包含javax.persistence.Cacheable.class注释,而eclipselink-2.7.0工件未签名且包含相同的java类注释.
怎么解决这个问题?
编辑
用版本2.1.1替换javax.persistence artifact 2.2.0版修复了问题(这个没有签名),但我不确定这是正常情况.
可以使用其中任何一个在JPA中定义枚举
@Enumerated(EnumType.ORDINAL)
Run Code Online (Sandbox Code Playgroud)
要么
@Enumerated(EnumType.STRING)
Run Code Online (Sandbox Code Playgroud)
我想知道这两个定义的优点和缺点是什么?
我听说ORDINAL比使用EclipseLink的STRING表现更好(更快).
真的吗?