标签: eclipselink

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万
查看次数

请解释一下:insertable = false,updatable = false

如果某个字段有注释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)

java jpa eclipselink java-ee

132
推荐指数
5
解决办法
12万
查看次数

like子句JPQL中的参数

我正在尝试使用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 包裹.有帮助吗?

java jpa eclipselink jpql sql-like

84
推荐指数
3
解决办法
11万
查看次数

在JPA中使用的referencedColumnName是什么?

在JPA中有一个名为的属性referencedColumnName,可以设置@JoinColumn, @PrimaryKeyJoinColumn这个设置背后的想法,有人可以举出一个很好的例子来说明这个可以使用的地方吗?

orm hibernate jpa openjpa eclipselink

65
推荐指数
4
解决办法
9万
查看次数

为什么我需要配置数据源的SQL方言?

当我们使用Hibernate配置数据源时,我们应该添加hibernate.dialect属性(或者eclipselink.target-database如果您使用的是EclipseLink).

我想知道方言的含义是什么?我根据Hibernate的文档配置了这个属性,但我不知道它的含义是什么.

configuration hibernate persistence.xml eclipselink dialect

54
推荐指数
5
解决办法
10万
查看次数

JPA2:不区分大小写,就像匹配任何地方一样

我一直在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)

问题: …

java criteria eclipselink hibernate-criteria jpa-2.0

47
推荐指数
4
解决办法
6万
查看次数

在JPA中禁用缓存(eclipselink)

我想使用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)

我误会了什么吗?

java entity jpa eclipselink

44
推荐指数
6
解决办法
7万
查看次数

Entitymanager.flush()VS EntityManager.getTransaction().commit - 我应该更喜欢什么?

更新数据库时我应该更喜欢什么?两种方法的优缺点是什么?何时使用其中一种方法?

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)

java jpa eclipselink

44
推荐指数
3
解决办法
8万
查看次数

EclipseLink 2.7.0和JPA API 2.2.0 - 签名不匹配

运行由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版修复了问题(这个没有签名),但我不确定这是正常情况.

java jpa eclipselink jpa-2.2

43
推荐指数
2
解决办法
1万
查看次数

JPA Enum ORDINAL vs STRING

可以使用其中任何一个在JPA中定义枚举

@Enumerated(EnumType.ORDINAL)
Run Code Online (Sandbox Code Playgroud)

要么

@Enumerated(EnumType.STRING)
Run Code Online (Sandbox Code Playgroud)

我想知道这两个定义的优点和缺点是什么?

我听说ORDINAL比使用EclipseLink的STRING表现更好(更快).
真的吗?

java orm enums jpa eclipselink

39
推荐指数
3
解决办法
2万
查看次数